1. Data 송신을 완료하면 연결을 끊는다
데이터 송수신 동작이 끝나면 client와 server 둘 중 하나가 connection termination 단계로 들어간다.
Web browser의 경우 보통 server측이 연결 끊기 동작을 실행한다 - TCP 4-way handshake
- [Server] Server 측(hostA)이 socket library의
close
를 호출한다. 그러면 server의 protocol stack이FIN
비트를 1로 세팅한 TCP header을 만들고 client에 송신한다. 이와 동시에 server측의 socket에는 연결 끊기 동작에 들어갔다는 정보를 기록한다. - [Client] Server에서
FIN=1
가 포함된 TCP header이 도착하면, client의 protocol stack은 자신의 socket에 server측이 연결 끊기 동작에 들어갔다는 것을 기록한다. 그리고 ACK를 server에게 반송한다. - [Client] Client측도
close
를 호출하고FIN
비트를 1로 세팅한 TCP header을 만들고 server에 송신한다. - [Server] ACK를 client에게 보낸다.
2. Socket을 말소한다
Server와의 대화가 끝나면 client는 바로 socket을 말소하지 않고 잠시 기다린 후 말소한다. 바로 말소해버리면 다음과 같은 오동작이 일어날 수 있다.
앞의 설명과 반대로 이번에는 client측에서 먼저 연결 끊기 동작이 시작된다고 해보자. 연결 끊기 동작은 다음과 같이 진행된다.
- Client가 FIN 송신
- Server가 ACK 송신
- Server가 FIN 송신
- Client가 ACK 송신
- 이때, server의 FIN이 담긴 패킷이 통신 동작 중간에 사라져 버리면 다시 한번 FIN을 보낼 수도 있다.
- 만약 client가 socket을 즉시 말소해버리면 기록되어있던 제어 정보가 사라지므로, socket에 할당되어 있던 port number도 날아간다.
- 이 시점에서 만약 다른 application이 새로운 socket을 만들고 그 port number을 할당해버리면 FIN이 엉뚱한 socket에 갈수도 있다.
3. 데이터 송수신 동작을 정리한다
이제 TCP protocol으로 data를 송수신하는 동작 전체를 정리해보겠다.
Client는 browser을 나타내고 server은 web server을 나타낸다.
- Socket 작성
- Server측에서 application이 동작하기 시작할때 socket을 만든 뒤, 접속대기 상태로 만든다.
- Client역시 socket을 작성한다.
- Socket 연결 (접속 동작)
- Client에서 server로 접속 동작 (TCP 3-way handshake)을 실행한다.
- Client -> Server으로
SYN=1
비트,ISN
(Initial Sequence #),Window size
등으로 만든 TCP header을 보낸다. - Server -> Client로
SYN=1
비트,ISN
,Window size
, 그리고ACK
등으로 만든 TCP header을 보낸다. - Client -> Server으로
ACK
를 담은 TCP header을 보낸다.
- 데이터 송수신
- Web의 경우 client가 server으로 request message를 보내는것부터 시작한다.
- Client -> Server: TCP는 데이터를 적당한 크기의 조각으로 분할하고 sequence number을 담은 TCP header를 맨 앞에 부가하여 server에 보낸다
- Server -> Client: ACK번호를 client에게 반송한다. 이때, server측의 receiver buffer에 빈 공간이 생기면 window값도 기록하여 함께 보낸다.
- Client의 request message를 받은 server이 적절한 response를 보내주는 동작은 위의 2개 동작에서 client와 server이 반대로 일어난다.
- 연결 끊기 동작
- 데이터를 다 보냈으면 TCP 4-way handshake을 통해 TCP connection termination이 일어난다.
- Server -> Client:
FIN=1
- Client -> Server:
ACK
- Client -> Server:
FIN=1
- Server -> Client:
ACK