///
Search

L4 - 1. TCP와 UDP개요, TCP 연결 과정, TCP 연결종료 및 상태 변화

TCP와 UDP

요약

TCP에만 연결(Connection, Session) 개념이 있다.
연결이라는 것은 논리적(Virtual)이기 때문에 Virtual Circuit 이라는 용어로도 번역된다.
연결은 결과적으로 순서번호로 구현된다.
Bytes 수만큼 증가하게 되어있다.
연결은 상태(전이) 개념을 동반한다.
누군가와 전화를 한다는 상황을 가정했을 때, 통화 하기 전의 상태와 연결이 이루어지고 나서 통화를 하는 상태를 생각해 볼 수 있다.
TCP는 배려가 있는, UDP는 배려가 없는 사람에 비유할 수 있다.
TCP는 수신하는 측에서 여유공간이 없다면 데이터를 송신하지 않는다.(Zero Window)
UDP는 수신하는 측이 어떤 상태이든 관심이 없다. 그저 보낼 뿐이다.
데이터의 단위
Ethernet(L2) : MAC 주소 + Frame
IP(L3) : IPv4 + Packet
TCP, UDP(L4) : Port 번호 + Segment(TCP), Datagram(UDP)
HTTP, SSL(Application) : Socket + Stream(시작 ~ 끝)

TCP

Client(Active하게 연결을 하는 주체)Server(기다리다 연결을 받는 주체)로 구성되어 있다.
서버는 누군가가 서버에 연결을 할 것이기 때문에 연결을 대기(Listen)하고 있다.
Client측의 Process가 Socket을 Open한다. 이 때, Process가 자신의 식별자인 PID를 갖는데 PID를 갖는 어떤 Client Process가 Socket을 열면 운영체제 입장에서 Socket에 TCP Port번호를 부여한다.
통신을 하기 위해서는 IP 주소와 접속 가능한 Port번호를 알아야 연결이라는 것을 시도해 볼 수 있다.
UDP는 연결이라는 개념은 없지만, TCP와 구조(socket 통신, port 번호 할당)는 비슷하다.

TCP 연결 과정 (3-way handshaking)

Sequence 번호 + 정책(MSS, Maximum Segment Size)을 교환하는 과정이다.
MSSSegment의 최대 크기를 이야기한다.
연결이라는 것은 프로토콜(관리적 정보)이 규정하는 정보를 교환하는 것
연결은 Virtual Circuit(논리적 연결)
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와 Server의 상호작용을 통해 일어나는 작업
연결 종료 시, Client는 서버에 FIN + ACK를 보낸다. 이 때, Server의 어떤 응답을 받을 때까지 Client는 FIN_WAIT1 상태가 된다.
이 신호를 받은 Server는 Client에 수신을 받았다는 의미로 ACK를 보내며 상태는 CLOSE_WAIT가 된다.
FIN_WAIT1상태이던 Client는 Server의 ACK신호를 받고 FIN_WAIT2상태가 된다.
여기까지 1번
연결을 끊으려는 측에서 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상태가 발생.
가급적이면 서버는 자기 자신이 연결이 끊는 것이 아닌, Client 측에서 끊도록 해야 한다(유도해야 한다).
Server 측에서 TIME_WAIT 가 발생하지 않도록 해야 한다.
만약 Server에서 TIME_WAIT상태가 발생했다면, 이는 Application protocol 상에 정상적이지 않은 문제가 발생했다는 뜻으로 해석할 수 있다.
Client는 마지막 ACK를 보내고 CLOSED상태가 되며, Server는 ACK를 받고 CLOSED상태가 된다.
Client는 마지막 ACK를 보내고 일정시간이 지나면 자동으로 CLOSED상태가 되면서 서버는 Socket을 클라이언트로부터 회수한다.
다이어그램 예시
연결 과정과 연결 종료 과정을 하나의 그림으로 이해하면 아래의 그림과 같다.
아래 그림에서 파란색 선은 서버를 나타내고, 빨간색 선은 클라이언트를 나타낸다.
연결 종료시 클라이언트는 Active하며 서버는 Passive함에 주목해야한다.
passive하다 : 클라이언트에 의해 종료가 됨
서버 관점
클라이언트 관점