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)을 교환하는 과정이다.
◦
MSS는 Segment의 최대 크기를 이야기한다.
◦
연결이라는 것은 프로토콜(관리적 정보)이 규정하는 정보를 교환하는 것
◦
연결은 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하다 : 클라이언트에 의해 종료가 됨
◦
서버 관점
◦
클라이언트 관점