TCP와 UDP 모두 OSI 7계층 중에서 전송계층에서 사용되는 통신 규약입니다.
먼저 전송 계층이 어떤 역할을 하는지 알아보겠습니다.
전송계층
송신자와 수신자를 연결하는 통신 서비스를 제공하는 계층입니다.
전송 계층은 다음과 같은 기능을 합니다.
- 오류 제어
- 흐름 제어
- 혼잡 제어
- 데이터 순서화
- 분할과 병합
오류 제어
데이터의 변형이나, 데이터 분실 시 재전송 기능으로 복구를 진행합니다.
흐름 제어
송신자와 수신자의 전송과정에서 속도 차이를 제어해주는 기능을 합니다.
혼잡 제어
네트워크 상태에 따라 전송률을 제어합니다.
분할과 병합
데이터 크기가 전송계층에서 처리할 크기보다 큰 경우 분할하고, 수신한 데이터를 원래 크기로 모으는 기능을 합니다.
#전송계층이 없는경우?
데이터의 순차 전송을 보장할 수 없다
흐름 문제
- 송수신자 간의 데이터 처리 속도 차이로 인하여 수신자가 처리할 수 있는 데이터량을 초과하는 경우가 있다.
혼잡문제
- 네트워크 관련한 문제가 발생해서, 송신자 측에서 데이터를 보내도 네트워크 문제로 전송이 안될 수도 있다.
위에서 나열한 특징은 TCP와 UDP 모두에 해당되는 것은 아닙니다. 따라서 둘의 차이를 보겠습니다.
TCP ( Transfer Control Protocol )
TCP ( 전송 제어 프로토콜 ) 은 두개의 호스트를 연결하고 데이터 스트림을 교환하게 해주는 중요한 네트워크 프로토콜입니다.
TCP는 데이터와 패킷이 보내진 순서대로 전달되는 것을 보장해줍니다.
TCP의 특징으로는 다음과 같습니다.
- 양방향 통신
- 데이터 순차 전송
- 흐름 제어
- 혼잡 제어
- 오류 제어
TCP 세그먼트
프로토콜 내부에서 데이터가 처리되거나 움직이는데 그러한 단위를 세그먼트라고 합니다.
TCP 프로토콜은 어플리케이션 단엣 데이터를 전송을 하면, 데이터를 작은 단위로 자르고, TCP 헤더를 붙여서 TCP세그먼트를 생성합니다.
생성된 TCP 세그먼트는 패킷화되어 상대방과 주고 받게 됩니다.
TCP 헤더는 위의 그림과 같습니다.
Source port와 Destination port는 각 송신 과 수신포트를 의미합니다.
Window Size는 수신측에서 수신받을 데이터량을 정할 때 사용합니다.
중간에 9가지의 Flag가 존재하는 것을 보실 수 있습니다. 이 값들은 TCP 연결을 제어하고 데이터를 관리하는 부분입니다.
- ACK는 보낸 패킷에 대한 확인 응답을 받는 비트입니다.
- SYN는 TCP가 Connection을 맺을때 사용하는 비트입니다.
- FIN는 connection을 연결하고서 끊을 때 사용하는 비트입니다.
TCP 3-way handshake
TCP는 양방향 통신이라는 특징을 가지고 있습니다. 이 양방향 통신을 하기 위해서 3-way handshake라는 과정을 가집니다.
다음과 같은 순서로 connection을 맺습니다
1. 송신자에서 수신자에게 연결을 신청할 때, SYN 비트를 1로 설정하여 패킷을 송신합니다.
2. 양방향 통신이기 때문이기 때문에 수신자가 위의 패킷을 수신하면, SYN과 ACK비트를 1로 설정해서 클라이언트에게 보냅니다.
3. 클라이언트도 서버측에 보낸 패킷을 잘 받았다는 ACK비트를 설정한 패킷을 보내면서 connection을 맺게 됩니다.
TCP의 데이터 전송 방식
3-way handshake로 커넥션을 맺은 이후로부터는, 패킷을 보내면 그에 대한 ACK를 수신을 하게 됩니다.
이러한 확인 응답 비트를 통해서 신뢰성있는 통신을 하게 됩니다.
다음으로는 TCP의 특징이였던 혼잡제어, 흐름제어, 오류제어에 대해 간단히 알아보겠습니다.
혼잡 제어
네트워크 내에 패킷의 수가 과도 하게 증가 할때 데이터 전송량을 조절하기 위한 기업입니다.
AIMD(Additive Increase / Multiplicative Decrease)
- 패킷을 처음에 하나를 보내고, 문제없이 도착했다면, 윈도우 사이즈를 1를 늘립니다.
- Timout이나 전송이 실패했다면 윈도우 사이즈를 절반으로 합니다.
- 한번에 보내는 패킷의 수에 해당하는 윈도우 사이즈가 조금씩 늘기 때문에 , 시간이 오래 걸리는 단점이 있습니다.
Slow Start
- AIMD과 같게 패킷을 처음에 하나를 보내면서 시작합니다.
- 보낸 패킷의 ACK가 도착할때마다 임계점(ssthresh : Slow Start Threshold)까지 윈도우의 크기를 1씩 증가시킵니다.
- 임계점이 넘으면 선형적으로 증가합니다.
- 한번의 주기에 윈도우의 크기를 2배씩 증가합니다. AIMD에 비해 전송속도가 2배씩 증가합니다.
- ACK를 수신하지 못한 경우 윈도우 크기를 1로 합니다.
Fast Retransmit 빠른 재전송
- 패킷을 받는 쪽에서 먼저 도착해야할 패킷이 도착하지 않고 다음 패킷이 도착한 경우에도 ACK를 보냅니다.
- 순서대로 잘 도착한 마지막 패킷의 다음 패킷의 순번을 ACK 패킷에 실어서 보내는데,
- 중복된 순번의 패킷을 3개를 받으면 재전송을 하고 window size를 줄입니다.
- 타임아웃이 지나지 않아도 유실된 패킷을 재전송할 수 있는 장점이 있습니다.
Fast Recovery 빠른 회복
네트워크가 혼잡하다고 판단되면 window size를 1로 줄이지 않고 절반으로 줄이고 선형 증가 시키는 방법입니다.
빠른 회복이 사용되면 그 뒤로는 순수한 AIMD 방식으로 동작합니다.
혼잡 제어 정책
위의 혼잡 제어 방식을 사용하여서 혼잡 제어하는 정책.
TCP Tahoe
3번의 중복된 ACK를 받거나 Timeout이 발생한 경우, ssthresh(임계점)을 수정합니다.
윈도우의 크기를 1로 초기화하는 모습을 볼 수 있습니다.
TCP RENO
RENO는 3 ACK Duplicated 와 Timeout을 구별합니다.
3 ACK Duplicated에서는 윈도우의 크기를 1이 아닌 절반으로 줄이고, 그뒤로 선형적으로 증가시키는 빠른 회복 기법을 사용합니다.
Timeout의 경우에는 윈도우 크기를 1로 줄이고 SlowStart 시작하는 것을 볼 수 있지만 임계점을 유지합니다.
흐름 제어
송신측과 수신측 사이의 데이터 속도 차이를 제어하기 위한 기법입니다
Stop and Wait
- 매번 전송한 패킷에 대한 확인 응답을 받고 그 다음 패킷을 전송합니다. (비효율)
Sliding Window
- 송신 측과 수신측에 버퍼(윈도우)를 만들고, 수신측의 버퍼(윈도우)를 넘치지 않을만큼, 확인 응답없이 세그먼트를 전송합니다.
- 송신에 성공하면, 송신측에 윈도우를 이동시키면서 다음 프레임을 전송합니다.
오류제어
Stop and Wait
- 흐름제어에서도 사용된 기법인데, 이 방법으로도 기본적인 오류제어가 가능합니다.
- 보낸 패킷에 대한 응답이 오지 않는다면, 다시 재전송하는 방식을 사용합니다.
그외에 AutoMatic Repeat Request 기법을 사용합니다.
Selective Repeat
- 오류가 발생한 데이터만 재전송하는 방식
Go-Back-N
- 전송된 패킷이 분실됐을 경우나 Timout 이 발생한 경우 확인된 마지막 패킷 이후 모든 패킷을 재전송합니다.
TCP 4-way handshake 연결해제
양방향 통신을 위해 connection을 맺었기 때문에 데이터의 송수신을 끊기 위해서는 4-way handshake 방식을 이용합니다.
송신자 쪽에서 더이상 보낼 데이터가 없다면 FIN을 1로 설정하고 송신합니다.
수신자는 역시 확인응답인 ACK를 보냅니다.
근데 여기서 바로 통신을 끝낸다면, FIN이전에 보냈었던 패킷에 대해서 수신자에서 송신자 측으로 보낼 데이터가 남아 있을 수도 있기 때문에, 잠시동안 TimeWait 시간을 둬서 받지 못한 데이터들을 송신자 측으로 보내고 수신하고 됩니다.
더이상 처리할 데이터가 없다면 수신자 측에서 송신자측으로 FIN 패킷을 보내고, 송신자측에서 다시 ACK를 수신자측으로 보내게 된다면 connection을 close하게 됩니다.
UDP ( User Datagram Protocol )
TCP보다 신뢰성이 떨어지지만 전송 속도가 빠른 프로토콜을 말합니다.
신뢰성이 떨어지는 이유는 다음과 같은 특징을 가지고 있기 때문입니다.
- 오류 제어 없음(checksum으로 검출만 존재)
- 흐름 제어 없음
- 혼잡 제어 없음
UDP의 전송방식은 너무 단순해서 서비스의 신뢰성이 낮고, 데이터의 도착순서가 바뀌거나 중복 또는 누락되곤 합니다.
UDP 세그먼트
UDP는 어플리케이션단에서 내려온 데이터를 TCP와 달리 자르지않고 UDP 헤더를 붙여서 UDP 세그먼트를 만들어 전송합니다.
UDP 헤더는 송수신을 위한 Source포트와 Destination 포트가 존재하고, 오류 검출을 위한 체크섬이 존재합니다.
UDP 데이터 전송
UDP는 확인 응답을 받지 않기 때문에, 패킷의 도착에 따른 전송 순서를 보장하지 않고 신뢰성을 보장하지 않습니다.
출처
https://www.techopedia.com/definition/10339/three-way-handshake
http://intronetworks.cs.luc.edu/current1/html/tcp.html
https://jung-story.tistory.com/12
https://velog.io/@jsj3282/TCP-흐름제어혼잡제어-오류제어
https://velog.io/@nnnyeong/Network-TCP-오류제어
https://velog.io/@hidaehyunlee/TCP-와-UDP-의-차이
https://ko.wikipedia.org/wiki/%EC%A0%84%EC%86%A1_%EA%B3%84%EC%B8%B5
'CS' 카테고리의 다른 글
동기 & 비동기 , 블로킹 & 넌블로킹 (0) | 2022.12.15 |
---|