본문으로 바로가기


[네트워크] TCP와 UDP

category OS 및 기타 전산 지식 2018. 6. 4. 22:51





네트워크에서 통신(네트워크 호스트간 패킷 전송)을 하는데 사용되는 규약중에 TCP와 UDP라는 프로토콜이 존재한다. 두 프로토콜은 처리하는 방법이나 속도, 보안성 등의 차이점이 있다. 상대적으로 중요한 TCP에 비중을 두고 설명하겠다.



UDP

UDP는 송신자와 수신자간의 연결이 없고 단방향성을 가지고 데이터를 보내기만 한다. 또한 데이터 전송에 대한 완료, 실패 신호를 다시 받지 않고 보내기 때문에 중간에 데이터를 분실하거나 다른 방식으로 잘못되어도 해결하지 못한다. 즉 안전성을 보장하지 않는다. 하지만 그만큼 단순하고 가벼워서 빠르다는 장점이 있다.



TCP

TCP는 흔히 연결형이라고 말한다. 바로 통신 중인 네트워크 호스트간 연결을 말한다. 간단하게 A가 B에서 패킷을 전송하기 위해서 상호작용이 필요하다는 말이다. A가 B에게 패킷을 전송하면 B는 받거나 못받거나 둘 중 하나의 상황을 맞이할 것이다. 만약 정상적으로 패킷을 받았다면 ACK이라고 하는 시그널을 A에게 보내게 되고 A는 그 신호를 받고 다음으로 전송해야할 패킷을 전송한다. 만약 중간에 패킷이 분실되어 B가 제대로된 전송을 받지 못해 ACK을 보내지 못한다면 A는 기다리다가 다시 패킷을 재전송해준다. 이러한 점에서 TCP가 안전성을 보장해준다고 말한다. 추가로 패킷의 흐름제어 기법 중 하나로 패킷을 하나하나 일일이 확인하며 보내는 것(Stop and Wait 방식)이 아니라 일정 범위(여러개)의 패킷을 정하고 보내는 방식을 사용하기도 한다.


- 슬라이딩 윈도우 (전송 방식)

여러개의 연속된 패킷을 한 번에 전송하고 그에 대한 ACK을 받으면 다음 패킷으로 한 칸 이동하여 새로운 패킷을 보내는 것을 말한다. 이 때 하나의 패킷에 대한 ACK을 받는 것이 아닌 전송완료된 패킷들에 대해 한 번의 ACK을 받고 전송된 패킷 수 만큼 다음 패킷들을 다시 윈도우에 포함시켜 전송 및 관리를 하게된다. 동시에 하나의 패킷만을 처리하는 정지-대기(Stop and Wait) 방식보다 효율적이다.


다음과 같이 10개의 패킷이 있다고 가정하자. 그리고 윈도우는 0~4까지 5개를 포함한다. 이때 B가 한 개, 또는 최대 5개 이하의 패킷에 대한 전송을 정상적으로 받으면 그 전달받은 최종 위치의 ACK을 한 번만 보내어 새로운 윈도우를 형성할 수 있도록 한다.


                   A                                           B

[0 1 2 3 4] 5 6 7 8 9                       0 1


이렇게 0~4의 윈도우에서 0과 1을 전송받아 최종적인 1에대한 ACK을 보내면 A는 윈도우를 아래와 같이 바꿔 또 다시 패킷 전송을 진행한다.


                   A                                           B

0 1 [2 3 4 5 6] 7 8 9                       0 1



다음으로 패킷 전송 실패시 처리하는 방법은 '고백 N'방식과 '선택적 재전송'방식이 있다.



- 고백 N (전송 실패 처리 방식)

수신 네트워크 호스트는 패킷을 정상적으로 받지 못했을 때, ACK대신 NAK을 송신 네트워크 호스트에게 보낸다. 우선 송신측에서 [0 1 2 3]의 패킷을 전송했지만 2번 패킷에서 전송 오류가 발생하면 2번에 대한 NAK을 보내고 2번 뒤에 있는 패킷은 확인도 하지 않고 다시 전송 받게된다. 즉 송신측이 2번에 대한 NAK을 받으면 [2 3]를 다시 보낸다. 


         A                                  B

        [0 1 2 3]                          0 1 2 3


2번에 대한 NAK을 보내면 그 뒤에 있는 패킷들은 버리게된다. 그리고 NAK을 받은 송신측에서 다시 [2 3] 패킷을 전송해준다.


         A                                  B

    0 1 [2 3]                          0 1


하지만 굳이 전송한 [3] 데이터를 버리고 다시 전송을 받는 것은 비효율적일 수 있다. 그래서 이를 보완한 방식이 선택적 재전송 방식이다.



- 선택적 재전송 (전송 실패 처리 방식)

위와 같은 상황에서 [0 1 3] 패킷은 정상적으로 받고 [2]만 받지 못했다면 2에 대한 NAK을 보내고 송신측에서 다시 [2]패킷만 재전송 해준다. 이렇게되면 전체적인 전송 시도량과 전송 횟수를 줄일 수 있기 때문에 전송 효율을 높일 수 있다.


         A                                  B

        [0 1 2 3]                          0 1 2 3


2번에 대한 NAK을 보내면 그 뒤에 있는 패킷들은 버리게된다. 그리고 NAK을 받은 송신측에서 다시 [2 3] 패킷을 전송해준다.


         A                                  B

     0 1 [2] 3                          0 1 3








궁금한 점이나 함께 더 깊은 얘기를 나누기 위해 댓글을 남겨주신다면 필히 답변하겠습니다.