4계층 프로토콜로 공인망에서 신뢰할 수 있고, 정보 유실이 없는 통신을 보장하기 위한 기능
세션을 안전하게 연결하고 데이터를 분할하여 전송한 패킷 (세그먼테이션) 이 잘 전송되었는지 확인하는 기능이 있다.
패킷에 번호(Sequence Number)를 부여하고, 잘 전송되었는지 응답(Acknowledge Number) 한다. 송신 측이 SEQ 1번 패킷을 보냈다면, 수신 측이 이 패킷을 잘 받았다는 뜻으로, 2번을 달라는 표시로 ACK 2번을 준다.
한꺼번에 얼마나 보내야 수신자가 잘 받아 처리할 수 있는지 전송 크기(Window Size) 까지 고려해 통신한다. 매번 작은 패킷을 하나 보내고 응답을 받아야만 하나를 더 보낼 수 있는 것이 모든 데이터를 전송하는 데 긴 시간이 걸릴 것 이기 때문이다.
TCP 헤더에서 윈도 사이즈 최대 크기는 2의 16승으로, 64KB 정도이지만 현대 네트워크에서는 너무 작은 숫자이다. 그래서 헤더 사이즈를 늘리지 않고, 뒤의 숫자를 무시하는 방법으로 윈도 사이즈를 증가 시켜 통신한다.
데이터에 유실이 발생할 경우, 윈도 사이즈를 절반으로 떨어트려 정상적인 통신이 되는 경우, 서서히 하나씩 늘린다.
TCP에서는 유실없는 안전한 통신을 위해 통신 시작 전, 사전 연결작업을 진행한다. 클라이언트와 서버 간에 커넥션을 맺기위해 수행하는 과정, 데이터를 받을 준비가 안 된 상황에서 데이터를 일방적으로 전송하면 목적지에 데이터를 정상적으로 처리할 수 없어, 데이터가 버려지기 때문이다.
TCP에서는 패킷을 주고받으면서 통신을 서로 준비하므로, 3방향 핸드셰이크 (3Way Handhsake )라고 부른다.
3방향 핸드셰이크 과정이 생기다보니 기존 통신과 새로운 통신을 구분하기 위해, 어떤 패킷이 새로운 연결 시도이고, 기존 통신에 대한 응답인지 구분하기 위해 헤더에 플래그(Flag) 라는 값을 넣어 통신한다. 총 6비트로, 각 비트가 1인 경우 해당 내용을 나타낸다.
FIN
RST
URG
PSH
통신을 처음 시도한다면, 송신자가 플래그에 있는 SYN 필드를 1로 표기해 패킷을 보내고 이때 자신이 사용할 첫 seq no를 적어 보낸다. 이 SYN 패킷을 받은 수신자는 SYN과 ACK 비트를 플래그에 1로 표기해 응답한다.
자신이 보내는 첫 패킷이므로, SYN을 1로 표기하고 기존 송신자가 보냈던 패킷의 응답이기도 하므로, ACK 비트도 함께 1로 표기 하는 것이다. (송신자의 연결 시도 허락)
이때 자신이 사용할 seq no를 적고, ack no에 1을 추가한 값을 넣어 응답한다.
수신자의 응답을 받은 송신자는 연결을 확립하기 위해 다시 한 번 응답 메시지를 보낸다. 이때부터는 기존 메시지의 응답이므로 ACK 필드만 1로 표기한다. 수신자가 ACK 번호를 11로 표기했다면, 시퀀스 번호를 11로 표기해 응답한다.
(수신자 : 10번 받았으니 11번 보내주셈)
연결이 되어 있는 상태에서 연결을 종료하고자 하는 cliet (혹은 server)는 연결을 종료하겠다는 FIN 플래그가 담긴 패킷을 전송한다. 이때 client FIN-WAIT-1 상태가 된다.
server는 FIN 플래그를 받고, 확인메시지로 ACK를 보내고, 자신의 통신이 끝내기 위해 앱에 신호를 보낸다. 이때 CLOSE_WAIT 상태가 된다. 이 ACK 를 받은 client는 FIN_WAIT-2 가 된다.
server 는 연결 종료를 위해, FIN 패킷을 client 에게 전송하고, LAST_ACK 상태로 변경한다.
FIN을 받은 client는 TIME_WAIT 상태로 변경되어, FIN에 대응되는 ACK 를 server 에 전송한다. 이 때 상태는 TIME_WAIT 가 된다. ACK 를 받은 server 는 소켓을 CLOSED 상태로 변경한다.
일정 시간(@MSL: Maximum Segment Lifetime, 약 120초) 이 경과한 뒤, client 도 소켓을 CLOSED 상태로 변경한다.
TCP와 달리 4계층 프로토콜이 가져야 할 특징이 거의 없다.
데이터 통신은 데이터 전송의 신뢰성이 핵심인데 UDP는 데이터 전송을 보장하지 않는 프로토콜이므로 제한된 용도로만 사용된다.
음성 데이터나 실시간 스트리밍과 같이 멀티캐스트처럼 단방향으로 다수의 단말과 통신해 응답을 받기 어려운 환경에서 주로 사용된다.
일부 데이터가 유실되더라도 시간에 맞추어 계속 전송하는 것이 중요할 경우, 사용되어진다.
UDP는 TCP와 달리 통신 시작 전, 3way handshake와 같이 연결을 확립하는 절차가 없고 대신 첫 데이터는 리소스 확보를 위해 인터럽트를 거는 용도로 사용되고 유실된다.
UDP 프로토콜을 사용하는 애플리케이션이 대부분 이런 상황을 인지하고, 동작하거나 연결 확립은 TCP 프로토콜을 사용하고, 애플리케이션 끼리 모든 준비를 마친 후, 실제 데이터만 UDP를 이용하는 경우가 대부분이다.
그래도 TCP보다는 빠르다는 장점이 있다.
참조한 책 및 사이트
IT 엔지니어를 위한 네트워크 입문
https://sjlim5092.tistory.com/35