TCP Protocol

TCP Header

Port 정보

  • TCP는 포트를 통해 통신하므로 Source, Destination Port를 가지고 있다.

  • 16bit

  • 데이터를 전송할 때 데이터를 순서에 맞게 나눠서 전송하는데 이를 위한 Sequence Number도 있다.

Ack Number

  • 잘 받았는지 확인하기 위한 정보

Code Bits

  • URG, ACK, PSH, RST, SYN, FIN

TCP 3-way-handshake (연결)

Server에 Connect하면 sync를 1로해서 보낸다.

seq에 1을 더해서 ack을 설정한 뒤 접속한다.

TCP 4-way-handshake (연결 해제)

Client에서 FIN을 1로 해서 보내고, Server에서 ACK를 1을 주고, 잠시 후에 FIN을 1로 보내고
마지막으로 Cli에서 FIN 1을 보낸다.

port가 사용중이라하면 4th 과정에서 응답을 안해줘서 그럴 수도 있다.


전송

header에 Len 인자에 데이터 길이를 넣어서 보낸다.

2GB 파일을 패킷의 최대 크기인 1500KB???로 나눠서 보내는데,, ,

len : 전체 데이터의 길이

ACK = seq + len(데이터 길이)

제어

수도관처럼 시간 당 보낼 수 있는 양에 한계가 있다.

적절하게 전송해줘야 유실되지않고, 정확이 도착할 것이다.

네트워크 트래픽에 따른 효율적/신뢰적 송신을 위한 제어 알고리즘 적용


흐름 제어(Flow Control)

End to End 컴퓨터의 성능을 자동으로 detect해서 전송한다.
Sliding Window 알고리즘을 통해 알맞게 흐름량을 제어해준다.

Sliding window

송신자와 수신자가 한 번에 주고 받을 수 있는 양의 minimum을 선택하여 window size로 정한다.

SYN와 SYN/ACK 사이의 시간인 RTT를 기반으로 window size를 재설정해줘서 mininum보다 더 큰 값으로 설정된다.

ACK를 받지 못해도 window size만큼 데이터를 보낸다.

ACK를 받으면 한 칸씩 sliding하며 window를 옮겨준다. => ACK을 받은 만큼 데이터를 또 전송할 수 있다.

  • 과거에는 Stop and Wait 방식을 사용해서 각 패킷마다 번호를 할당하고, 한 패킷이 보내질 때 이에 대한 ACK가 돌아와야 다른 패킷을 전송했다.

혼잡 제어(Congestion Control)

다양한 망을 타고 데이터가 전송 될 때, 망의 traffic을 고려해서 알맞게 데이터 양을 설정하는 알고리즘

Congestion window 초기값

  • 1 MSS (기본 단위)
  • 한 번에 데이터를 보낼 수 있는 크기
  • MSS = MTU - (IP 헤더 길이) - (TCP 헤더 길이)
    • 보통 1500 - 20 - 20 =. 460

AIMD(Additive Increase/Multicative Decrease)

  • 지속적으로 증가시키다가 트래픽이 안오면 절반으로 감소시키고, 들어오면 다시 증가시키는 알고리즘
  • 처음 CWND = 1
  • 패킷 전송이 성공하여 ACK가 도착하면 CWND += 1
  • 도착하지않으면 CWND /= 2

Slow Start

  • 처음 CWND = 1
  • 패킷 전송이 성공하여 *ACK가 도착하면 CWND = 2
  • 도착하지않으면 CWND = 1

Congestion Avoidance

  • CWND가 일정 크기에 도달하고, ACK가 도착하면 CWND += 1

UDP

UDP 란?

UDP는 User Datagram protocol로 사용자 데이터그램 프로토콜이다.

TCP와 달리 브로드캐스팅 지원을 해주고, 신뢰성이 없기 때문에 데이터의 유실이 일부있어도 문제 없고, 속도가 필요한 동영상 스트리밍 등의 서비스에서 많이 사용된다.

헤더도 TCP에 비해 단순하여 비교적 가볍다.

Author

Inwoo Jeong

Posted on

2021-11-03

Updated on

2021-11-03

Licensed under

You need to set install_url to use ShareThis. Please set it in _config.yml.

댓글