TCP (Transmission Control Protocol)
TCP 통신은 신뢰적이고 순차적인 연결 방식이다. UDP에 비해선 느리다.
unreliable한 인터넷을 통해 종단간에 신뢰성 있는 바이트 스트림을 전송하도록 설계되었음.
TCP는 송신자와 수신자 모두가 소켓이라고 부르는 종단점을 생성함으로써 이루어짐.
이때 연결 설정은 3-way handshake를 통해서 행해짐.
흐름제어 (Flow Control) : 송신측(호스트) - 수신측(호스트)
- 수신측이 송신측보다 데이터 처리 속도가 빠르면 문제가 없지만, 송신측이 더 빠를 경우 문제가 발생한다.
- 수신측의 제한된 저장 용량을 초과한 이후에도착하는 데이터는 손실 될 수 있다. 만일 손실 된다면 불필요하게 응답과 데이터 전송이 송/수신 측 간에 빈번하게 발생한다.
- 위의 위험들을 줄이기 위해선 송신 측의 데이터 전송량을 수신측에 따라 조절해야한다.
흐름제어 방식에는 Stop and Wait 와 Sliding Window가 있다.
Stop and Wait
송신측에선 매번 전송한 패킷에 대한 수신측의 확인 응답(ACK)을 받아야만 그 다음 패킷을 전송하는 방식이다.
구조는 간단하지만 하나를 보내고 그 확인 응답을 기다린 뒤 하나를 보내는 방식이기 때문에 상당히 비효율적이다.
Sliding Window
수신 측에서 설정한 윈도우 크기만큼 송신측에서 확인 응답 없이 세그먼트를 전송할 수 있게 하여 데이터 흐름을 동적으로 조절하는 방식.
sliding window를 사용하여 송신측 버퍼의 범위는 수신측의 여유 버퍼 공간을 반영하여 동적으로 바뀜으로써 흐름 제어를 수행.
- Window : 전송, 수신 스테이션 양쪽에서 만들어진 버퍼의 크기
- Window Size : (가장 최근 ACK로 응답한 프레임의 수) - (이전에 ACK 프레임을 보낸 프레임의 수)
- 이는 ACK를 수신하지 않아도 여러 개의 프레임을 연속적으로 전송할 수 있음
동작 방식
먼저 윈도우에 포함되는 모든 패킷을 전송하고, 그 패킷들의 전달이 확인되는 대로 이 윈도우를 옆으로 옮김으로써 그 다음 패킷들을 전송
- Window : TCP/IP를 사용하는 모든 호스트들은 송신하기 위한 것과 수신하기 위한 2개의 Window를 가지고 있다. 호스트들은 실제 데이터를 보내기 전에 3-way handshaking을 통해 수신 호스트의 receive window size에 자신의 send window size를 맞추게 된다.
- 수신측 & 송신측 윈도우
혼잡제어 (Congestion Control) : 송신측(호스트) - 라우터(네트워크)
송신측의 데이터 전달과 네트워크의 데이터 처리 속도 차이를 해결하기 위한 방법.
송신측의 데이터는 지역망이나 인터넷으로 연결된 대형 네트워크를 통해 전달되는데, 이러한 네트워크 상의 라우터가 항상 한가한 것이 아님. 만약 하나의 라우터에 데이터가 몰리게 될 경우, 라우터가 데이터를 모두 처리할 수 없음. 이렇게 되면 호스트는 재전송을 하게 되고 혼잡이 더 가중되어 오버플로우나 데이터 손실이 발생하게됨.
이러한 네트워크의 혼잡을 피하기 위해 송신측에서 보내는 데이터의 전송 속도를 강제로 줄이는 것이 혼잡 제어.
혼잡제어 방식에는 AIMD, Slow Start, Fast Retransmit, Fast Recovery 가 있음.
AIMD (Additive Increase / Multiplicative Decrease)
처음에 패킷을 하나씩 보내고 이것이 문제 없이 도착하면 Window 크기(단위 시간에 보내는 패킷 수)를 1씩 증가시켜가며 전송하는 방식.
그러나 만약 전송에 실패하거나 일정 시간이 넘으면 패킷을 보내는 속도를 절반으로 줄임.
공평한 방식 - 여러 호스트가 한 네트워크를 공유하고 있으면 나중에 진입하는 쪽이 처음엔 불리하지만, 시간이 흐르면 평행 상태로 수렴.
단점 : 초기에 네트워크의 높은 대역폭을 사용하지 못해 시간이 오래걸림. 네트워크가 혼잡해지는 상황을 미리 감지하지 못하여 혼잡해지고 나서야 대역폭을 줄이게 됨.
Slow Start (느린 시작)
AIMD와 마찬가지로 패킷을 하나씩 보내면서 시작하고 패킷이 문제없이 도착하면 각각의 ACK패킷마다 window size를 1씩 늘려주어 한 주기가 끝나면 window size가 2배가 된다.
AIMD에 비해서 이는 전송 속도가 지수함수 형태로 증가하게 된되고, 만약 혼잡이 발생하는 경우 window size를 1로 줄인다.
처음엔 네트워크의 수용량을 예상할 수 있는 정보가 없으나, 한번 혼잡을 경험하고 나면 네트워크의 수용량을 어느정도 예측할 수 있다.
따라서 혼잡이 발생하였던 window size의 절반 까지는 이전처럼 지수함수 형태로 window의 크기를 증가 시키고 그 이후부터는 1씩 증가시킨다.
Fast Retransmit (빠른 재전송)
이는 패킷을 받는 쪽에서 먼저 도착해야할 패킷이 도착하지 않고 다음 패킷이 도착한 경우에도 ACK 패킷을 보낸다.
순서대로 잘 도착한 마지막 패킷의 다음 패킷의 순번을 ACK 패킷에 담아 보내게 되므로, 중간에 하나가 손실되게 되면 송신 측에서는 순번이 중복된 ACK 패킷을 받게 되고 이를 감지가여 문제가된 순번의 패킷을 재전송 하는 것이다.
송신측에서 동일한 순번의 패킷을 3번 받게되면 재전송을 하고, 혼잡을 감지하여 window size를 줄이게 된다.
Fast Recoverty (빠른 회복)
혼잡한 상태가 되면 window size를 1로 줄이는게 아니라 반으로 줄인 뒤 선형 증가 시키는 방식.
'Computer Science > 네트워크' 카테고리의 다른 글
[네트워크] HTTP와 HTTPS (0) | 2021.05.18 |
---|---|
[네트워크] UDP (0) | 2021.05.18 |
[네트워크] TCP 3-way handshake & 4-way handshake (0) | 2021.05.17 |
[네크워크] HTTP의 GET과 POST 비교 (0) | 2021.05.17 |
[네트워크] OSI 7계층 (0) | 2021.05.17 |