TCP와 UDP는 네트워크 OSI 7계층 중 전송 계층에서 사용하는 프로토콜이다.
전송 계층은 송신자와 수신자를 연결하는 통신서비스를 제공하고 IP에 의해 전달되는 패킷의 오류를 검사하며 재전송 요구 제어등을 담당하는 계층이다. 쉽게 말해 데이터의 전달을 담당하는데, TCP, UDP는 이 전송 계층에서 데이터를 보내기 위해 사용하는 프로토콜을 말한다.
인터넷상에서 데이터를 메세지의 형태(세그먼트 라는 블록 단위)로 보내기 위해 IP와 함께 사용하는 프로토콜이다.
일반적으로 TCP와 IP가 함께 사용되는데, IP가 데이터의 전송을 처리한다면 TCP는 패킷을 추적 및 관리한다.
수신측이 송신측보다 데이터 처리 속도가 빠르면 문제없지만, 송신측의 속도가 빠를 경우 문제가 생긴다.
데이터의 처리 속도를 조절하여 수신자의 버퍼 오버플로우를 방지한다.
송신측과 수신측의 TCP 버퍼 크기 차이로 인해 생기는 데이터 처리 속도 차이를 해결하기 위한 기법이다.
매번 전송한 패킷에 대해 확인 응답을 받아야만 그 다음 패킷을 전송하는 방법
수신측에서 설정한 위도우 크기만큼 송신측에서 확인 응답 없이 세그먼트를 전송할 수 있게 하여 데이터 흐름을 동적으로 조절하는 제어기법으로 전송은 되었지만, ACK를 받지 못한 byte의 숫자를 파악하기 위해 사용한다.
먼저 Window에 포함되는 모든 패킷을 전송하고, 그 패킷들이 전달이 확인되는대로 Window를 옆으로 옮겨 다음 패킷들을 전송한다.
Window : TCP/IP를 사용하는 모든 호스트들은 송신하기 위한 것과 수신하기 위한 2개의 Window를 가지고 있다. 호스트들은 실제 데이터를 보내기 전에 '3 way handshaking'을 통해 수신 호스트의 receive window size에 자신의 send window size를 맞추게 된다.
네트워크 내의 패킷 수가 넘치게 증가하지 않도록 방지한다.
송신측의 데이터는 지역망이나 인터넷으로 연결된 대형 네트워크를 통해 전달되는데, 만약 한 라우터에 데이터가 몰릴 경우, 모두 처리할 수 없게 된다. 이로인해 계속 재전송 하게되면서 오버플로우나 데이터 손실이 발생한다.
흐름제어가 송신측과 수신측 사이의 전송속도를 다루는데 반해, 혼잡제어는 호스트와 라우터를 포함한 보다 넓은 관점에서 전송 문제를 다루게 된다.
처음에 패킷을 하나씩 보내고 이것이 문제없이 도착하면 window 크기(단위 시간 내에 보내는 패킷의 수)를 1씩 증가시켜가며 전송하는 방법이다.
패킷 전송에 실패하거나 일정 시간을 넘으면 패킷의 보내는 속도를 절반으로 줄인다.
시간이 흐르면 평형상태로 수렴하게 되는 특징이 있지만, 초기에 네트워크의 높은 대역폭을 사용하지 못하며, 네트워크가 혼잡해지고 나서야 대역폭을 줄인다.
AIMD와 마찬가지로 패킷을 하나씩 보내면서 시작하고, 패킷이 문제없이 도착하면 각각의 ACK 패킷마다 window size를 1씩 늘려준다.(window size 2배)
혼잡이 발생하면 window size를 1로 떨어뜨리게 된다.
먼저 도착해야할 패킷이 도착하지 않고 다음 패킷이 도착한 경우에도 ACK 패킷을 보내게 된다.
단, 순서대로 잘 도착한 마지막 패킷의 다음 패킷의 순번을 ACK 패킷에 실어서 보내게 되므로, 중간에 하나가 손실되게 되면 송신 측에서는 순번이 중복된 ACK 패킷을 받게 된다.
이것을 감지하는 순간 문제가 되는 순번의 패킷을 재전송 해줄 수 있고, 중복된 순번의 패킷을 3개 받으면 재전송을 하며 window size를 줄이게 된다.
혼잡한 상태가 되면 window size를 1로 줄이지 않고 반으로 줄이고 선형증가시키는 방법이다.
이 정책까지 적용하면 혼잡 상황을 한번 겪고 나서부터는 순수한 AIMD 방식으로 동작하게 된다.
UDP(User Datagram Protocol)란, 비연결형 통신을 지원하는 전송 계층 프로토콜이다.
네트워크를 통해 전달된 값이 변경되었는지를 검사하는 값으로 무결성을 제공한다.
하지만 이 방법에는 결함이 있다. 전송 도중 checksum값이 바뀔 수도 있고 데이터가 변형되었음에도 불구하고 checksum 값이 동일한 경우도 발생할 수 있다.