1. 서버는 들어오는 새 연결을 Accept할 준비를 한다. (socket, bind, listen 호출)
2. connect를 호출하여 open한다. Client는 SYN(synchronize segment : 서버에게 보낼 data의 sequence number)를 보낸다.
일반적으로 SYN과 함께 전송되는 데이터는 없다. 그저 IP Header / TCP Header / 여러가지 TCP 옵션들에 대한 정보가 포함된다.
3. 서버는 클라이언트의 SYN에 응답하여 ACK를 보낸다. 또한, 보낼 데이터의 sequence number를 포함한 SYN을 보낸다. '
이걸 하나의 segment에 담아 보낸다.
4. 마지막으로, 클라이언트는 서버의 SYN에 응답하여 ACK를 보낸다.
TCP Options
MSS
이 옵션을 사용하면, SYN에 maximum segment size를 포함시킨다. 송신자는 Maximum of Segment size로 수신자 측의 MSS값을 사용한다.
SYN은 Connection에서 주고받는 패킷이다. 처음 통신을 시작할 때, 서로에게 서로가 Receive할 수 있는 segment size를 알려주기 위함이다.
Window Scale Option
TCP에서 window의 최대 크기는 65535( 16bit )이다. TCP Header에 해당하는 field가 16bit를 차지하고 있기 때문이다.
긴 지연 시간을 가지는 경로는 가능한 최대 처리량을 늘리기 위해 더 큰 window가 필요하다. 이 옵션은 TCP Header의 window가 0-14bit만큼 확장되어야 함을 명시한다. 제공되는 최대 window 크기는 거의 1GB정도 된다. (65535 * 2^14)
이 옵션을 사용하려면 각 단말기 사이의 통신이므로 서로가 지원해야 한다. SO_RCVBUF socket option으로 이를 확인할 수 있다.
Timestamp Option
이 옵션은 빠른 통신을 필요로 한다. 데이터가 오래되거나, 지연되거나 또는 duplicated segment에 의해 변질될 가능성을 막기 위한 것이다.
Window Scale Option과 비슷하게 동작한다.
TCP Connection Termination
Step 1. Client에서 active close를 호출하면 FIN segment를 보낸다. 데이터 전송을 끝내겠다는 뜻이다.
Step 2. Server에서 FIN segment를 받으면 그에 따른 ACK를 보내고, receive queue의 맨 마지막에
'Receipt of the FIN(더 이상 데이터를 Receive하지 않겠다는 뜻)'을 전달한다.
Step 3. 그 후, receive queue가 비워진 후에 passive close가 호출되고, FIN을 전송한다.
Step 4. Client는 마지막 FIN을 받고 그에 해당하는 ACK를 전송한다.
2번과 3번에서 Server가 전송하는 ACK와 FIN은 하나의 segment로 구성될 수도 있다.
FIN은 SYN처럼 sequence number space의 1byte를 차지한다. 그래서, 각 FIN에 대한 ACK의 sequence number는 FIN의 sequnce number + 1이 된다.
Step 2, 3에서는 passive close 호출 시점부터 active close가 종료되는 시점 사이에도 데이터 전송이 이루어진다. 이것을 'Half Close'라 한다.'
Unix Process가 종료되면, 수동 or 자동적으로 모든 열려 있는 discriptor가 종료된다. 물론, 열려 있던 TCP socket들은 FIN을 보냈을 것이다.
TCP State Transition Diagram
Termination, Connection하는 TCP 연산은 Stae Transition Diagram으로 명시된다.
- 책에서 이부분 그림 참고 -
아직 2가지 말하지 않은 상태가 있는데, 바로 서버/클라이언트 각각이 동시에 SYN을 보낼 때와 각각이 동시에 FIN을 보낼 때에 관한 상태이다.
이는 챕터 18에서 예제와 함께 자세히 설명한다.
이 상태들은 netstat 명령으로 볼 수 있다.
200ms 안으로 전송이 가능하다면 data와 함께 ACK를 담아서 보낸다. 이걸 Piggybacking이라고 한다. 만약 200ms을 넘는 시간이 걸린다면 ACK를 보낸 후 data를 보낸다.
UDP가 사용될 경우, 그냥 두 패킷이 서로 교환된다. 그리고, TCP에서 제공되는 또다른 중요한 기능으로 'Congestion Control'이라는 것이 있는데,
UDP에서는 직접 따로 처리해 주어야 한다. 그럼에도 불구하고 UDP는 많은 어플리케이션에서 사용된다. UDP는 데이터 전송량이 적고, connection을 유지하는 오버헤드가 없기 때문이다.
'Network > Unix Network Programming' 카테고리의 다른 글
[UNP] Transport Layer에 대한 이야기 (0) | 2017.03.22 |
---|---|
[UNP] SCTP Association Establishment and Termination (0) | 2017.03.14 |
[Unix Network Programming] TIME_WAIT State (0) | 2017.03.06 |
[Unix Network Programming] Chapter 2.5 SCTP(Stream Control Transmission Protocol) (0) | 2017.02.27 |
[UNP] 2.4 (TCP) Transmission Control Protocol (0) | 2017.02.24 |
[UNP] Chapter 2.3 (UDP) User Datagram Protocol (0) | 2017.02.21 |
[UNP] Chapter 2 The Big Picture - 용어 설명 (0) | 2017.02.21 |
[UNP] Chapter 2 The Transport Layer: TCP, UDP, and SCTP 1 소개 (0) | 2017.02.21 |