TCP는 연결지향 프로토콜, 연속적으로 패킷의 상태 정보를 확인하고 유지한다.
SYN
패킷을 보내고, 초기 순차 번호(a)를 포함한다.SYN-ACK
패킷을 보낸다. 초기 응답 순차 번호(a+1)를 포함한다.SYN-ACK
패킷을 받고, ACK
패킷을 보내서 연결 설정을 완료한다.SYN
: Synchronize sequence numbers
ACK
: Acknowledgement
세그먼트
: TCP 세그먼트, TCP 세션으로 연결된 양 끝단 간에 교환, 전달되는 데이터 단위 (= 세그먼트 헤더 (TCP 헤더) + 데이터)
close()
를 호출한다.CLOSE_WAIT
상태에 들어간다. 그리고 아직 남은 데이터가 있다면 마저 전송을 마친 후에 close()
를 호출한다.FIN_WAIT_2
)FIN
패킷을 보냅니다.LAST_ACK
상태로 들어간다.FIN
패킷을 받고, ACK
패킷을 보내 연결 종료를 완료합니다.TIME_WAIT
으로 기다린다. → 에러로 인해 연결이 데드락으로 빠지는 것을 방지하기 위해 일정 시간이 넘어가면 CLOSED
로 들어간다.CLOSED
:TIME_WAIT
시간이 끝나면 닫는다.https://mindnet.tistory.com/entry/네트워크-쉽게-이해하기-22편-TCP-3-WayHandshake-4-WayHandshake
https://velog.io/@averycode/네트워크-TCPUDP와-3-Way-Handshake4-Way-Handshake
https://sjlim5092.tistory.com/37
TCP의 3-way handshake와 4-way handshake에 대해 설명하시오.
TCP 3,4 way handshake의 단계수 차이가 나는 이유
Client가 데이터 전송을 마쳤다고 하더라도 Server는 아직 보낼 데이터가 남아있을 수 있기 때문에 일단 FIN에 대한 ACK만 보내고, 데이터를 모두 전송한 후에 자신도 FIN 메시지를 보내기 때문이다.
만약 Server에서 FIN 플래그를 전송하기 전에 전송한 패킷이 Routing 지연이나 패킷 유실로 인한 재전송 등으로 인해 FIN 패킷보다 늦게 도착하는 상황이 발생하면 어떻게 될까?
이러한 현상에 대비하여 Client는 Server로부터 FIN 플래그를 수신하더라도 일정시간(Default: 240sec)동안 세션을 남겨 놓고 잉여 패킷을 기다리는 과정을 거친다. (TIME_WAIT 과정)
초기 Sequence Number인 ISN을 0부터 시작하지 않고 난수를 생성해서 설정하는 이유?
Connection을 맺을 때 사용하는 포트(Port)는 유한 범위 내에서 사용하고 시간이 지남에 따라 재사용된다. 따라서 두 통신 호스트가 과거에 사용된 포트 번호 쌍을 사용하는 가능성이 존재한다. 서버 측에서는 패킷의 SYN을 보고 패킷을 구분하게 되는데 난수가 아닌 순처적인 Number가 전송된다면 이전의 Connection으로부터 오는 패킷으로 인식할 수 있다. 이런 문제가 발생할 가능성을 줄이기 위해서 난수로 ISN을 설정한다.