TCP, UDP

GwanMtCat·2023년 9월 14일
0
post-thumbnail

TCP (Transmission Control Protocol) 란?

4계층 프로토콜로 공인망에서 신뢰할 수 있고, 정보 유실이 없는 통신을 보장하기 위한 기능

  • 흐름제어
    • 수신측이 송신측보다 데이터 처리 속도가 빠르면 문제없지만, 송신측의 속도가 빠를 경우 문제가 생긴다.
    • 이러한 위험을 줄이기 위해 송신 측의 데이터 전송량을 수신측에 따라 조절하는 것
  • 혼잡제어
    • 송신측의 데이터는 지역망이나 인터넷으로 연결된 대형 네트워크를 통해 전달된다. 만약 한 라우터에 데이터가 몰릴 경우, 자신에게 온 데이터를 모두 처리할 수 없게 된다.
    • 이런 경우 호스트들은 또 다시 재전송을 하게되고 결국 혼잡만 가중시켜 오버플로우나 데이터 손실을 발생시키게 된다. 따라서 이러한 네트워크의 혼잡을 피하기 우해 송신측에서 보내는 데이터의 전송속도를 강제로 줄이게 되는데, 이러한 작업을 혼잡제어라고 한다.

세션을 안전하게 연결하고 데이터를 분할하여 전송한 패킷 (세그먼테이션) 이 잘 전송되었는지 확인하는 기능이 있다.

패킷에 번호(Sequence Number)를 부여하고, 잘 전송되었는지 응답(Acknowledge Number) 한다. 송신 측이 SEQ 1번 패킷을 보냈다면, 수신 측이 이 패킷을 잘 받았다는 뜻으로, 2번을 달라는 표시로 ACK 2번을 준다.

한꺼번에 얼마나 보내야 수신자가 잘 받아 처리할 수 있는지 전송 크기(Window Size) 까지 고려해 통신한다. 매번 작은 패킷을 하나 보내고 응답을 받아야만 하나를 더 보낼 수 있는 것이 모든 데이터를 전송하는 데 긴 시간이 걸릴 것 이기 때문이다.

TCP 헤더에서 윈도 사이즈 최대 크기는 2의 16승으로, 64KB 정도이지만 현대 네트워크에서는 너무 작은 숫자이다. 그래서 헤더 사이즈를 늘리지 않고, 뒤의 숫자를 무시하는 방법으로 윈도 사이즈를 증가 시켜 통신한다.

데이터에 유실이 발생할 경우, 윈도 사이즈를 절반으로 떨어트려 정상적인 통신이 되는 경우, 서서히 하나씩 늘린다.

3-Way Handshake

TCP에서는 유실없는 안전한 통신을 위해 통신 시작 전, 사전 연결작업을 진행한다. 클라이언트와 서버 간에 커넥션을 맺기위해 수행하는 과정, 데이터를 받을 준비가 안 된 상황에서 데이터를 일방적으로 전송하면 목적지에 데이터를 정상적으로 처리할 수 없어, 데이터가 버려지기 때문이다.

TCP에서는 패킷을 주고받으면서 통신을 서로 준비하므로, 3방향 핸드셰이크 (3Way Handhsake )라고 부른다.

3방향 핸드셰이크 과정이 생기다보니 기존 통신과 새로운 통신을 구분하기 위해, 어떤 패킷이 새로운 연결 시도이고, 기존 통신에 대한 응답인지 구분하기 위해 헤더에 플래그(Flag) 라는 값을 넣어 통신한다. 총 6비트로, 각 비트가 1인 경우 해당 내용을 나타낸다.

  • SYN
    • 연결 시작 용도로 사용, 연결이 시작될 때 SYN 플래그에 1로 표시

  • ACK
    • 초기 SYN이 아닌 모든 패킷은 기존 메시지에 대한 응답으로 ACK 플래그가 1을 표시

  • FIN

    • 연결 종료 시 1로 표시, 데이터 전송을 마친 후 정상적으로 양방향 종료 시 사용

  • RST

    • 연결 종료 시 1로 표시, 연결 강제 종료를 위해 연결을 일방적으로 끊을 때 사용

  • URG

    • 긴급 데이터인 경우, 1로 표시
  • 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번 보내주셈)

4-Way Handshake

연결이 되어 있는 상태에서 연결을 종료하고자 하는 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 상태로 변경한다.


UDP (User Data Protocol)

TCP와 달리 4계층 프로토콜이 가져야 할 특징이 거의 없다.

데이터 통신은 데이터 전송의 신뢰성이 핵심인데 UDP는 데이터 전송을 보장하지 않는 프로토콜이므로 제한된 용도로만 사용된다.

음성 데이터나 실시간 스트리밍과 같이 멀티캐스트처럼 단방향으로 다수의 단말과 통신해 응답을 받기 어려운 환경에서 주로 사용된다.

일부 데이터가 유실되더라도 시간에 맞추어 계속 전송하는 것이 중요할 경우, 사용되어진다.

UDP는 TCP와 달리 통신 시작 전, 3way handshake와 같이 연결을 확립하는 절차가 없고 대신 첫 데이터는 리소스 확보를 위해 인터럽트를 거는 용도로 사용되고 유실된다.

UDP 프로토콜을 사용하는 애플리케이션이 대부분 이런 상황을 인지하고, 동작하거나 연결 확립은 TCP 프로토콜을 사용하고, 애플리케이션 끼리 모든 준비를 마친 후, 실제 데이터만 UDP를 이용하는 경우가 대부분이다.

그래도 TCP보다는 빠르다는 장점이 있다.


참조한 책 및 사이트

IT 엔지니어를 위한 네트워크 입문
https://sjlim5092.tistory.com/35

0개의 댓글