TCP는 네트워크 계층 중 전송 계층에서 사용하는 프로토콜로서, 장치들 사이에 논리적인 접속을 성립(extablish)하기 위하여 연결을 설정하여 신뢰성을 보장하는 연결형 서비스
이다.
TCP Handshake
는 TCP/IP 프로토콜을 이용해서 통신을 하는 응용 프로그램이 데이터를 전송하기 전에 먼저 정확한 전송을 보장하기 위해 상대방 컴퓨터와 사전에 세션을 수립하는 과정을 의미한다.
출처 : https://www.crocus.co.kr/1362
TCP 통신을 이용하여 데이터를 전송하기 위해 네트워크 연결을 설정(Connection Establish)하는 과정
SYN
패킷을 보낸다.SYN
패킷을 보냄과 동시에 SYN/ACK
응답을 기다리기 위해 SYN_SENT
상태로 변하게 된다.SYN
요청을 받고 클라이언트에게 요청을 수락하는 ACK
패킷과 SYN
패킷을 보내고 SYN_RCVD
(SYN_RECEIVED) 상태로 변하여 클라이언트가 ACK
패킷을 보낼 때 까지 기다리게 된다.ACK
패킷을 보내고 이 후 ESTABLISHED
상태가 되어 데이터 통신이 가능하게 된다.SYN_RECV
는 요청자가 보낸 SYN
패킷을 수신자가 제대로 받은 상태를 의미한다.SYN
패킷의 Sequence Number는 운영체제에 의해서 랜덤하게 생성된다.ACK
패킷의 Acknowledgement Number는 신뢰적 데이터 전송을 위해 사용되는 것이다.ACK
는 수신자가 제대로 된 시퀀스 번호를 받았다는 확인의 의미이다. 다시 요청자에게 돌려줄 때의 승인 번호(Acknowledgement)는 처음 요청자가 보낸 시퀀스 번호 + 1이다.상대방이 보낸 시퀀스 번호 + 상대방이 보낸 데이터의 byte
를 합쳐서 승인 번호를 만들어낸다. 즉, 내가 여기까지 받았으니, 다음에는 여기부터 보내달라는 일종의 마킹이다.TCP의 연결을 해제(Connection Termination)하는 과정
그냥 한 쪽에서 일방적으로 연결을 끊어버리면 다른 한 쪽은 연결이 끊어졌는지 지속되고 있는지 알 방법이 없다.
연결을 종료하기 전에 아직 다 처리하지 못한 데이터가 있을 수도 있기 때문에 양 쪽이 다 정상적으로 연결을 종료할 준비가 되었는지를 확인하는 과정이 필요하다.
=> 4 Way Handshake는 3 Way Handshake처럼 순차적으로 주고받는 방식이 아니라 상대방이 응답을 줄 때까지 대기하는 과정이 포함되어 있기때문에 중간에 뭐 하나 엇나가면 서로 계속 대기만 하고 있는 데드락(Deadlock)
상황이 연출될 수도 있다.
출처 : https://evan-moon.github.io/2019/11/17/tcp-handshake/
출처 : https://beenii.tistory.com/127
CLOSE()
함수를 호출하게 된다.CLOSE()
를 호출하면서 서버에게 FIN
패킷을 보내게 되는데, 이때 FIN
패킷에 실질적으로는 ACK
도 포함되어 있다. 그리고 나서 클라이언트는 FIN_WAIT_1
상태로 들어간다.CLOSE_WAIT
상태로 바꾼 후 ACK
segment를 전송한다.CLOSE_WAIT
를 통해 자신의 통신이 끝날때까지 기다리는 상태가 된다.ACK
segment를 받은 클라이언트는 FIN_WAIT2
로 변환되고 이때 서버는 CLOSE() 함수를 호출하고 FIN segment를 클라이언트에게 보낸다.ACK
segment를 보낸 후 클라이언트는 TIME_WAIT
상태로 전환된다.FIN
패킷에도 시퀀스 번호가 포함되어 있긴 한데, 랜덤한 값으로 생성해서 보내지 않는다.FIN
패킷에 승인 번호를 함께 묶어서 FIN+ACK
로 보내는 이유는 Half-Close
라는 기법을 사용하기 때문이다.ACK
패킷을 응답으로 보낼 수 있다.A. Client가 데이터 전송을 마쳤다고 하더라도 Server는 아직 보낼 데이터가 남아있을 수 있기 때문에 일단 FIN에 대한 ACK만 보내고, 데이터를 모두 전송한 후에 자신도 FIN 메시지를 보내기 때문이다.
A. 이러한 현상에 대비하여 Client는 Server로부터 FIN 플래그를 수신하더라도 일정시간(Default: 240sec)동안 세션을 남겨 놓고 잉여 패킷을 기다리는 과정을 거친다. (TIME_WAIT 과정)
A. Connection을 맺을 때 사용하는 포트(Port)는 유한 범위 내에서 사용하고 시간이 지남에 따라 재사용된다. 따라서 두 통신 호스트가 과거에 사용된 포트 번호 쌍을 사용하는 가능성이 존재한다. 서버 측에서는 패킷의 SYN을 보고 패킷을 구분하게 되는데 난수가 아닌 순차적인 Number가 전송된다면 이전의 Connection으로부터 오는 패킷으로 인식할 수 있다. 이런 문제가 발생할 가능성을 줄이기 위해서 난수로 ISN을 설정한다.
https://gmlwjd9405.github.io/2018/09/19/tcp-connection.html
https://beenii.tistory.com/127
https://www.crocus.co.kr/1362
https://evan-moon.github.io/2019/11/17/tcp-handshake/ => 정리가 너무 잘 되어 있는 사이트
https://github.com/WeareSoft/tech-interview/blob/master/contents/network.md#frame-packet-segment-datagram