기본적인 TCP의 개념과 정의를 알고 있는 상태라고 가정하고 설명한다.
CLOSED
: 포트가 닫힌 상태LISTEN
: 포트가 열린 상태로 연결 요청 대기 상태SYN_RCV
: SYNC 요청을 받고 상대방의 응답 대기 상태ESTABLISHED
: 포트 연결 상태SYN
: 연결 설정 (Synchronize Sequence Number)ACK
: 응답 확인 (Acknowledgement)FIN
: 연결 해제 (Finish)TCP에서의 패킷으로, 전송할 데이터 바이트와 TCP에 의해 데이터에 추가되는 헤더로 구성된다.
네트워크 프로토콜 TCP(Transmission Control Protocol)에서 사용되는 연결 설정 방법
데이터를 주고받을 수 있는 두 호스트 간의 연결을 설정하는 과정
Step 1: 클라이언트가 서버에 연결 요청 (SYN)
SYN
(Synchronize) 패킷 송신Step 2: 서버가 클라이언트 요청에 응답 (SYN-ACK)
SYN
패킷을 수신SYN-ACK
(Synchronize-Acknowledgment) 패킷 송신Step 3: 클라이언트가 서버에 응답 (ACK)
SYN-ACK
패킷에 대해 ACK
(Acknowledgment) 패킷 송신http://www.tcpipguide.com/free/t_TCPConnectionEstablishmentProcessTheThreeWayHandsh-3.htm
SYN
와 ACK
를 주고받으며 데이터 수신 여부를 확인 논리적으로 총 네 단계가 필요한데, 서버의 SYN + ACK
를 한 단계로 축약하여 세 단계를 가짐동일한 연결의 두 인스턴스가 동일한 시퀀스 번호를 너무 빨리 재사용하는 것, 즉 이전 연결의 세그먼트가 이후 연결의 인스턴스를 방해할 가능성(이전 연결로부터 오는 패킷으로 인식할 가능성)이 있는 경우를 방지하기 위함이다.
TCP 표준 문서 RFC793 Page.27에 따르면, “To avoid confusion we must prevent segments from one incarnation of a connection from being used while the same sequence numbers may still be present in the network from an earlier incarnation” (혼란을 피하기 위해서는 이전 연결의 동일한 시퀀스 번호들이 아직 네트워크에 남아 있을 수 있는 동안, 한 연결의 인스턴스로부터 온 세그먼트들이 사용되는 것을 막아야 합니다) 라고 한다.
(ps. tcp 요청 자체는 하나에서 계속 나가기 때문에, 하나의 것에서 여러 번 요청을 한다는 것을 의미하려고 ‘instance’나 ‘implementation` 대신 ‘incarnation’로 표현한 듯 하다.)
TCP 연결을 단계적으로 해제(Connecntion Termination)하는 절차
Step 1: 클라이언트가 서버에 연결 종료 요청 (FIN)
FIN
(Finishing) 패킷 송신Step 2: 서버가 클라이언트 요청에 응답 (ACK)
FIN
패킷 수신ACK
(Acknowledgment) 패킷 송신Step 3: 서버가 클라이언트에 연결 종료 요청 (FIN)
FIN
패킷을 송신Step 4: 클라이언트가 서버 요청에 응답 (ACK)
FIN
패킷 수신ACK
패킷 송신http://www.tcpipguide.com/free/t_TCPConnectionTermination-2.htm
Packet Delay에 의해서 새로운 Connection이 이전 Connection의 영향을 받는 상황
원격 종단의 연결이 닫혔는지 확인해야할 경우 (TCP 4-Way Handshake의 마지막 ACK
Flag가 Server(Passive Closer)에게 전달되지 않아 Server가 LAST_ACK
상태를 유지하는 상황)
LAST_ACK
상태가 Timeout에 의해서 CLOSED
상태로 변경 되기전, Client는 새로운 Connection을 위해서 동일한 Local IP/Port를 이용하여 Server에게 SYN
Flag를 전송LAST_ACK
상태의 Server는 SYN
Flag를 받을 경우 RST
FLAG를 전송하여 Connection 생성을 막기 때문에 새로운 Connection 생성 실패tcp_timestamps
tcp_tw_reuse
tcp_tw_recycle
Socket Lingering
연결 설정 시에는 클라이언트의 연결 요청 시점과 서버의 연결 요청 시점이 거의 동시에 진행된다. 따라서 서버는 클라이언트에 대한 응답과 연결 요청을 SYN + ACK
로 압축하여 보낼 수 있다.
연결 종료 시에는 클라이언트가 데이터 전송을 마쳤다고 하더라도 서버는 아직 보낼 데이터가 남아있을 수 있기 때문에, FIN
에 대한 ACK
만 우선적으로 보낸다. 데이터를 모두 전송한 이후에 FIN
메시지를 보낸다.
참고
Understanding TCP handshakes is crucial for anyone working with network protocols. This post provides a great explanation! If you're also aiming to enhance your professional career, check out Resume Folks for expert resume writing services that can help you stand out in the job market.