상세 컨텐츠

본문 제목

[TCP/IP] TCP에 대해 알아보자 (+UDP와 비교)

CS구멍/네트워크🕊

by :Eundms 2024. 2. 17. 21:06

본문

TCP : 신뢰성 있는 데이터 통신을 위한 프로토콜

패킷 교환 방식으로 인해 일부 패킷이 손실될 수 있다


패킷 유실 문제 해결 방안

패킷마다 번호를 붙이고, 목적지에 도착했는지 확인한다

그리고 데이터를 주고받을 때 서버에게 데이터를 잘 받았다는 메시지를 전달한다

 

TCP 헤더와 플래그

헤더 안에는 해당 데이터에 대한 정보가 담겨 있음

 

발신지 주소, 목적지 주소

 

시퀀스 번호

패킷이 순서대로 들어왔는지 확인하기 위한 공간

 

윈도 크기

 

플래그

패킷의 상태를 알리는 목적의 헤더 정보

URG, ACK, PSH, RST, SYN, FIN

ACK(Acknowledgement) : 앞서 받은 데이터를 잘 처리했다

SYN(Synchronize) : 연결 요청

FIN(finish) : 통신이 마무리되어 연결 해제 요청

 

만약, ACK=1, SYN=1 이라면 앞선 데이터를 잘 처리했고, 나도 상대방과 연결해도 되는지 묻는 메시지

핸드쉐이크

서로 통신할 준비가 되었는지 확인하여 연결 오류로 인한 데이터 유실을 방지한다

3 way handshake

[SYN_SENT]                                 =SYN(연결요청)=>                    [SYN_RECEIVED]

[ESTABLISHED]              <= ACK + SYN (응답 + 연결요청)=   

                                                            =ACK(응답)=>                     [ESTABLISHED]

 

4 way handshake

[FIN_WAIT]    =FIN(연결종료)=>   [CLOSE_WAIT]

                       <=ACK(응답)= 
              /* 미처 보내지 못했던 데이터를 보낸다*/

[TIME_WAIT]  <=FIN(연결종료)=   [LAST_ACK]

                         =ACK(응답)=>        [CLOSED]


흐름제어 : 전송자와 수신자간의 데이터 속도 차이를 제어

 

방법1) 정지 - 대기 방식 (stop and wait) 

매번 전송한 패킷에 대해 확인 응답을 받은 뒤에 다음 패킷을 전송

=> 시간 오래 걸리고 효율이 좋지 않음

 

방법2) 슬라이딩 윈도 : 받는 사람이 처리할 수 있는 만큼(윈도우크기) 보낸다

윈도우 크기 : 수신자가 한번에 처리할 수 있는 데이터 크기

처음 전송자와 수신자가 연결하는 3방향 핸드셰이크 과정에서 윈도 크기가 정해짐

 

과정

전송자는 윈도우 크기 만큼 데이터를 순서대로 전달한다

수신자는 마지막으로 받은 데이터 번호를 전송자에게 전달한다

전송자는 수신자의 메시지 헤더에 적힌 번호를 확인해서 그 다음 순서부터 윈도 크기만큼 데이터를 다시 전달한다

 

=> 적절하게 처리 속도를 제어할 수 있다

 


혼잡 제어 : 네트워크 내 패킷의 수가 과도하게 증가하는 현상을 제어

네트워크 상황에 따라 데이터가 도달하는 속도가 다르고, 

만약 이를 고려하지 않은 채

(네트워크가 복잡해서 속도가 느렸고 이로 인해 도착하지 않았음을)

보내지 않은 줄 알고 재전송하게 되면

가뜩이나 복잡한 네트워크가 더 복잡해진다

 

처음에는 데이터를 천천히 보내다가 수신자가 잘 보내는 것을 확인하면 속도를 점차 높인다

그러다 한참 전에 전달한 데이터까지만 받았다고 이야기하면 

그때 네트워크가 혼잡하다는 사실을 인지하고 속도를 줄인다

 

속도를 얼마만큼 높이는지, 혼잡을 감지했을 때 얼마나 속도를 줄이는지에 따라 혼잡 제어 방법을 구분한다

 

합 증가/곱 감소(AIMD, Additive Increase/Multiplicative Decrease)와
느린시작(Slow Start) 

합 증가/곱 감소 (AIMD)

전송자가 수신자에게 패킷을 하나씩 보낸 뒤 잘 도착했다는 응답을 받으면,

초기 시작은 윈도크기만큼 여기에 크기를 1개씩 증가시킴

혼잡하다고 판단되면 윈도 크기를 1/2로 줄인다

 

=> 전송 속도가 천천히 증가하기 때문에 초기 전송 속도를 높이는데 걸리는 시간이 길다

 

느린시작 (Slow Start)

윈도 크기를 1로 시작해, 2배씩 증가시키고

혼잡하다는 판단이 씨으면 윈도 크기를 1로 급격히 줄인다

=> 시간이 지날 수록 많은 양의 데이터를 전달할 수 있다

 

현재 TCP에서는 처음에는 느린 시작을 사용하다가 특정 지점을 넘기면 합 증가/곱 감소로 변경하는 등

각 상황에 맞는 방법을 조합한 혼잡 제어 정책을 사용한다


UDP

신뢰성을 보장하지 않는다

 

1) 전송자와 수신자 사이에 연결되어 있는지 보장하지 않는다

 

2) 패킷 사이의 의존성이 없다 (패킷을 순서대로 전달할 필요가 없다)

-> 데이터 번호나 플래그와 같은 정보가 헤더에서 빠진다

=> 가볍다!

 

3) 전송속도를 스스로 제어하는 기능이 없다

처음에 정한 속도 그대로 데이터를 전송한다

중간에 데이터 속도가 지연되지 않고 일정한 속도를 보장할 수 있다

하지만 많이 사용하면 네트워크가 혼잡해진다

 

ex) 스트리밍 방송, 온라인 게임

관련글 더보기

댓글 영역