Computer science/네트워크
L4 - 1. TCP와 UDP개요, TCP 연결 과정, TCP 연결종료 및 상태 변화
dev_jun
2022. 10. 26. 11:06
TCP와 UDP
TCP
- Client(Active하게 연결을 하는 주체)와 Server(기다리다 연결을 받는 주체)로 구성되어 있다.
- 서버는 누군가가 서버에 연결을 할 것이기 때문에 연결을 대기(Listen)하고 있다.
- Client측의 Process가 Socket을 Open한다. 이 때, Process가 자신의 식별자인 PID를 갖는데 PID를 갖는 어떤 Client Process가 Socket을 열면 운영체제 입장에서 Socket에 TCP Port번호를 부여한다.
- 통신을 하기 위해서는 IP주소와 Port번호를 알아야 연결이라는 것을 시도해 볼 수 있다.
요약
- TCP에만 연결(Connection, Session) 개념이 있다.
- 연결이라는 것은 논리적(Virtual)이기 때문에 Virtual Circuit 이라는 용어로도 번역된다.
- 연결은 결과적으로 순서번호로 구현된다.
- Bytes 수만큼 증가하게 되어있다.
- 연결은 상태(전이) 개념을 동반한다.
- 누군가와 전화를 한다는 상황을 가정했을 때, 통화 하기 전의 상태와 연결이 이루어지고 나서 통화를 하는 상태를 생각해 볼 수 있다.
- TCP는 배려가 있는, UDP는 배려가 없는 사람에 비유할 수 있다.
- TCP는 수신하는 측에서 여유공간이 없다면 데이터를 송신하지 않는다.(Zero Window)
- UDP는 수신하는 측이 어떤 상태이든 관심이 없다. 그저 보낼 뿐이다.
TCP 연결 과정(3-way handshaking)
- Sequence 번호 + 정책(MSS, Maximum Segment Size)을 교환하는 과정이다.
- MSS는 Segment의 최대 크기를 이야기한다.
- Client와 Server가 있는데 Client가 연결 시도를 할 때, '내 MSS는 1460이야' 라고 정책을 함께 동반하여 보내면 Server측에서도 '내 MSS도 1460이야'라고 응답을 보낸다. 그러면 Client측에서는 아 그러면 어느정도 크기로 데이터를 보내면 되겠구나를 판단하여 데이터를 보내게 된다.
- 만약 Client의 MSS는 1460인데 Server의 MSS는 1400이라면 Client는 Server의 MSS에 맞춰서 데이터를 보내는 것이다.
- Client 연결 상태 흐름
- SYN_SENT -> ESTABLISHED
- Server 연결 상태 흐름
- LISTEN -> SYN_RCVD -> ESTABLISHED
TCP 연결 종료 과정(4-way handsdhaking)
- Client가 Active한 주체가 된다. 따라서 연결을 시도하는 것도, 연결을 종료하는 것도 Client이다.
- 연결 종료는 연결이 되어있음(ESTABLISHED 상태)을 가정해야한다. 그래야 종료할 연결이 생기기 때문이다.
- 연결 종료시 Client는 서버에
FIN + ACK
를 보낸다. 이때 Server의 어떤 응답을 받을 때까지 Client는FIN_WAIT1
상태가 된다. - 이 신호를 받은 Server는 Client에 수신을 받았다는 의미로
ACK
를 보내며 상태는CLOSE_WAIT
가 된다. FIN_WAIT1
상태이던 Client는 Server의ACK
신호를 받고FIN_WAIT2
상태가 된다.- 연결을 끊으려는 측에서
FIN + ACK
를 보내고, 받은 측이ACK
를 보내는 이 과정이 한 세트가 되며, 이 과정에 총 2회 일어난다. 그래서 이름도 4-way handshaking이다. - 두번째 연결을 끊는 과정에서는 Server측에서 먼저
FIN_ACK
신호를 Client측에 보내면서 상태는LAST_ACK
가 된다. - Server의
FIN_ACK
신호를 받은 Client는 다시 Server측에ACK
신호를 보내면서TIME_WAIT
상태가 된다.- TIME_WAIT 상태는 주목할 필요가 있다.
- 이 상태가 났다라는 것이 의미하는바는
연결을 끊자
라는 상태가 발생하는 것으로 연결을 최종적으로 끊기 전에 발생하는 상태이다. - 이 상황의 경우 Client측에서 먼저 연결을 끊자고 하였으니 Client측에서
TIME_WAIT
상태가 발생했다. 만약 Server에서TIME_WAIT
상태가 발생했다면, 이는 Application protocol상에 정상적이지 않은 문제가 발생했다는 뜻으로 해석할 수 있다.
- Client는 마지막
ACK
를 보내고CLOSED
상태가 되며, Server는ACK
를 받고CLOSED
상태가 된다.- Client는 마지막
ACK
를 보내고 일정시간이 지나면 자동으로CLOSED
상태가 되면서 Socket이 회수가 된다.
- Client는 마지막
연결 과정과 연결 종료 과정을 하나의 그림으로 이해하면 아래의 그림과 같다. 아래 그림에서 파란색 선은 서버를 나타내고, 빨간색 선은 클라이언트를 나타낸다. 연결 종료시 클라이언트는 Active하며 서버는 Passive함에 주목해야한다.