-
[Network] TCP 연결과 해제CS/Network 2021. 9. 28. 20:07
이 포스팅은 세미나를 위해 https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/master/Network를 참고하여 작성하였습니다.
연결 성립 (Connection Establishment)
- SYN(Synchronize): 클라이언트는 서버에 접속을 요청하는 SYN 플래그 비트가 설정된 세그먼트를 보낸다. 해당 세그먼트는 통신의 시작을 알리며, 세그먼트 내 순서 동기화를 위한 Sequence number인 M(임의명)를 담아 보낸다. 이때 클라이언트는 SYN을 보내고 SYN/ACK 응답을 기다리는 SYS_SENT 상태가 된다.
- SYN + ACK(Acknowledgement): 서버는 클라이언트의 요청인 SYN(M)을 받고 클라이언트에게 요청을 수락한다는 ACK(M+1)과 SYN(N) 플래그 비트가 설정된 세그먼트을 전송한다. 이때 서버는 SYN_RECVED 상태가 된다.
- ACK: 클라이언트는 서버의 수락 응답인 ACK(M+1)와 SYN(N) 플래그 비트가 설정된 세그먼트를 받고 서버의 응답을 받았다는 의미로, ACK(N+1) 플래그 비트가 설정된 세그먼트를 서버로 보내면 연결이 성립된다. 이후 실제 데이터를 전송할 수 있는 상태인 ESTABLISHED 상태가 된다. 서버 역시 클라이언트로부터 ACK을 받고 ESTABLISHED 상태로 변한다.
연결 해제 (Connection Termination)
- FIN: 클라이언트가 연결을 종료하겠다는 FIN 세그먼트를 전송한다. 이때, Sequence number인 N을 포함하여 전달한다. 클라이언트는 서버의 종료 요청 확인을 기다리는 FIN_WAIT1 상태가 된다. 서버는 클라이언트와의 소켓 종료 세그먼트를 전달 받고, 자신의 소켓 프로세스에게 종료를 요청하며 기다리는 CLOSE_WAIT 상태가 된다.
- ACK: 서버는 FIN 세그먼트를 받아 내부적으로 소켓을 종료하겠다는 의미로 FIN에 대한 ACK를 클라이언트한테 보낸다.
- FIN: 서버에서 내부적으로 소켓이 정상적으로 close() 되었으면, 이를 클라이언트 측에 알려주고자 Sequence number인 M을 포함하여 FIN 세그먼트를 보낸다.
이때, 서버는 마지막 응답 ACK만 받으면 Closed 될 수 있기 때문에 LAST_ACK 상태가 된다.
클라이언트는 FIN 세그먼트를 받고 확인했다는 의미로 ACK를 보낸다. 이때 ACK가 유실되어 요청 수신 측(클라이언트)에서 소켓이 제거되지 않는 문제점이 발생할 수 있다. 그래서 일정 시간 동안의 시간을 대기하는 TIME_WAIT 상태로 접어들고, 일정 시간이 경과되면 소켓을 종료하게 된다. - ACK: 클라이언트는 FIN 세그먼트를 받고 이에 응답하는 ACK를 M+1을 포함하여 서버에게 전송한다. 이후 서버는 ACK을 받고 소켓을 종료한다.
TCP Header Code Bit (Flag Bit)
TCP Header에는 Code Bit(Flag Bit)가 존재한다. 이 부분은 총 6 Bit로 이루어져 있으며, Urg-Ack-Psh-Rst-Syn-Fin 순서로 나타난다. 예를 들어, 010000일 경우 Ack 세그먼트이다.
Reference
'CS > Network' 카테고리의 다른 글
[Network] DNS 동작 원리 (0) 2021.09.29 [Network] HTTP vs HTTPS (0) 2021.09.29 [Network] TCP vs UDP (0) 2021.09.28 [Network] HTTP Methods - GET, POST, PUT, PATCH, DELETE (0) 2021.09.27 [Network] Cookie와 Session (0) 2021.09.15