TCP는 연결지향 프로토콜이다.
그렇다면 TCP는 어떻게 연결을 설정하고 해제할까?
용어 정리
- Handshake : 같은포트에 있고 서로 통신하기 적절한 상태라는 걸 확인하는 행위
- TCP 헤더에는 Flag bit이 존재, URG-ACK-PSH-RST-SYN-FIN 순으로 6비트, 해당 위치의 1비트를 1로 해서 정보를 전달
- SYN Packet: synchronize sequence numbers
- ACK Packet: acknowledgements
TCP 연결 (3-way handshake)
TCP는 양방향이기 때문에 양쪽 모두 통신이 가능한지를 알기 위해서 2-way가 아닌 3-way가 필요함
- 먼저 open()을 실행한 A 클라이언트가 B 서버에 SYN을 보내고 SYN/ACK를 기다리는 SYN_SENT 상태로 대기
- B 서버는 SYN_RECEIVED 상태로 바꾸고 SYN, ACK flag가 설정된 패킷을 보냄
(서버는 Listen 상태여야 한다) - SYN, ACK을 받은 A 클라이언트는 ESTABLISHED 상태로 변경, B 서버에게 응답 ACK를 보냄
(응답 ACK를 받은 서버는 ESTABLISHED상태)
2-way가 아닌 3-way
- A요청, B응답 2-way로는 부족하다
- A가 B가 보낸 데이터를 받을 준비가 되었는지(즉 B의 응답이 제대로 갔는지)확인하는 과정이 없기 때문
- 따라서 A가 잘 받았다는 마지막응답을 받은 후 통신이 시작된다.
TCP 연결해제 (4-way handshake)
- 먼저 close()를 실행한 A 클라이언트가 FIN 플래그를 보내고 FIN_WAIT 상태로 대기
- 서버는 CLOSE_WAIT으로 바꾸고 응답 ACK를 전달
- ACK를 받은 클라이언트는 상태를 FIN_WAIT2로 변경하고 서버의 FIN을 기다림 - 서버는 연결 종료를 위해 FIN을 클라이언트에 보내고 LAST_ACK 상태로 변경
- FIN을 받은 클라이언트는 ACK를 서버에 다시 전송, TIME_WAIT으로 상태 변경
- TIME_WAIT에서 일정 시간이 지나면 CLOSED로 변경
- ACK를 받은 서버도 포트를 CLOSED 상태로 변경
참고
- 연결 시 처음 SYN 패킷을 보낼 때 sequence number에는 난수가 들어감, 순차적인 수가 들어간다면 이전 통신에서 발생한 패킷으로 여길 가능성이 있기 때문에 초기 연결시에는 난수를 보냄
- ESTABLISHED : TCP로 접속이 맺어져 통신이 이루어지고 있음
- LISTEN: 서버가 수신 대기 상태
- TIME_WAIT : 접속을 종료하려는 중
'CS' 카테고리의 다른 글
[DB] Functional dependency(FD), 트리비얼 FD (0) | 2021.03.22 |
---|---|
[DB] DB 정규화란? (0) | 2021.03.22 |
[네트워크] TCP와 UDP 차이, TCP는 어떻게 순서를 보장하는가? (0) | 2021.03.20 |
[네트워크]GET과 POST의 차이 (0) | 2021.03.20 |
[네트워크] 네트워크 기본 5계층, OSI 7계층 (0) | 2021.03.20 |