L4 ▶ TCP 연결 / 종료 과정
2024. 6. 2. 15:20ㆍCS/네트워크
참고 자료 : 널널한 개발자님의 외워서 끝내는 네트워크 핵심이론 - 기초
TCP 연결 과정(3-way handshaking)
📝참고자료 : https://livenow14.tistory.com/57
연결 과정이라는 것은 정책을 교환한다는 의미이다.
여기서 교환되는 정책이란 Sequence의 번호를 교환하는 것과 MSS(Maximum Segment Size)정보를 교환하는 것이다.
Sequence 번호는 TCP연결이 순서번호로 구현된다는 의미이다. 그리고 순서번호는 전송하고자 하는 데이터의 바이트 수만큼 증가한다.
- 연결 요청단계(SYN_SENT) : 클라이언트 측 TCP는 서버TCP에게 SYN 세그먼트를 송신한다. 이 세그먼트에는 Payload가 들어있지 않다. 즉, 어플리케이션 계층의 데이터를 포함하지 않는다. 그리고 SYN 세그먼트에 Sequence number도 같이 넣어서 보낸다.
- 연결 승인단계(SYN_RCVD) : 대기중인 서버가 연결 요청을 받았다. 요청을 확인했으면 그림과 같이 SYN(4000) + ACK(1001) 이라는 메세지를 보내게 되는데 SYN(4000)은 자신의 순서번호를 보내는 것이고 ACK(1001)은 클라이언트의 순서번호를 잘 받았다는 의미이다.
- ACK 단계 : 연결 승인을 클라이언트가 받으면 클라이언트 입장에서는 연결이 성공한 것이다.(Client ESTABLISHED) 하지만 서버 입장에서는 아직 클라이언트의 응답이 없으므로 연결이 성공한 것이 아니다. 그래서 클라이언트는 ACK 신호를 서버에게 보내주어야한다. 클라이언트는 서버가 보내준 순서번호를 ACK 메세지로 전달한다. 그림과 같이 ACK(4001) 이렇게 말이다. 서버가 ACK를 수신했으면 비로소 서버도 연결이 성공한 상태가 된다.(Server ESTABLISHED)
TCP 연결 종료 과정(4-way handshaking)
📝참고자료 : https://hanaldo.tistory.com/50
TCP Connection의 종료는 4-way handshaking을 거친다. 연결 종료는 서로 연결이 성립된 상태에서 시작한다.
- 클라이언트가 통신을 종료하고자 FIN을 보낸후, FIN_WAIT 1 상태로 대기한다.
- FIN을 받은 서버는 상태를 CLOSE_WAIT으로 변경하고 ACK를 보낸다. 해당 ACK를 받은 클라이언트는 상태를 FIN_WAIT 2로 변경한다. 이와 동시에 서버는 해당 포트에 연결되어 있는 애플리케이션에게 CLOSE()를 요청한다.
- CLOSE() 요청을 받은 애플리케이션은 close되고, 서버는 FIN + ACK를 클라이언트에게 보낸 후 상태를 LAST_ACK로 변경한다.
- FIN_WAIT 2에서 서버로부터 FIN을 받으면 이에 대한 응답으로 ACK를 보낸 후 상태를 TIME_WAIT로 변경한다.
- 최종적으로 서버가 ACK를 받으면 CLOSED로 상태가 변경되고, 클라이언트도 일정 시간이 지나 CLOSED로 상태를 변경한다. 그리고 사용되었던 Socket을 모두 회수한다.
여기서 주의할 점은 Clinet가 Active한 존재라는 것이다. 즉 TIME_WAIT이 발생하는 쪽은 Clinet여야한다. Server가 스스로 연결을 끊도록 구현(Active CLOSE)해서 Server쪽에 TIME_WAIT이 발생하도록 하면 안된다. Server는 Passive CLOSE여야한다.
'CS > 네트워크' 카테고리의 다른 글
L4 ▶ TCP 연결이라는 착각 (1) | 2024.06.02 |
---|---|
L4 ▶ TCP Header / UDP Header (0) | 2024.06.02 |
L4 ▶ TCP / UDP (0) | 2024.05.26 |
L3 ▶ Ping과 RTT (0) | 2024.05.24 |
L3 ▶ ARP (0) | 2024.05.24 |