이 글은 이화여자대학교 이미정 교수님의 2014년 2학기 컴퓨터 네트워크 강의를 기반으로 재구성한 것입니다. 삽화는 링크를 출처로, 저작권은 J.F Kurose and K.W. Ross에게 있다는 것을 밝힙니다.
Transport Layer에서는 아래와 같은 내용들을 살펴본다.
- transport layer service principle
- multiplexing, demultiplexing
- UDP : connectionless transport
- TCP: connection oriented reliable transport
- reliable data transfer
- connection, disconnection
- flow control
- congestion control
Transport Layer Principles
transport layer는 source process에서 destination process로 data를 전송하는 역할을 한다. 즉, app process들 간의 logical communication을 지원한다.
조금 더 풀어 말하자면, sender transport layer는 application layer가 만든 message를 전달받고, host to host delievery를 수행하는 network layer에게 packet 운반을 맡긴다. 이후 receiver transport layer는 받은 packet을 application layer에 전달한다. 때문에 transport layer가 process to process delivery를 맡는다고 한다.
- 보내는 쪽에서는 message를 segment로 나누고 network layer에게 전달한다.
- 받는 쪽에서는 segment를 합쳐 message로 만들고 application layer에게 전달한다.
network layer는 host to host delivery를, transport layer는 process to process delivery를 담당한다.
Transport Layer Protocol
transport layer protocol에는 TCP, UDP 2종류가 있다.
- TCP : reliable, in-order delivery
- congestion control, flow control(receiver buffer 고려), connection setup 등을 지원한다.
- UDP : unreliable, unordered delivery
- 이 둘 다 delay나 bandwidth를 보장하지는 않는다.
Multiplexing & Demultiplexing
process to process delivery를 위해 multiplexing과 demultiplexing이 필요하다. (보내는 쪽에선 multiplexing, 받는 쪽에선 demultiplexing)
- multiplexing : 여러 socket으로부터 온 message들을 통합해서 network layer에게 보내는 것이다. 이 때 각 message마다 destination header를 붙이고 network layer에게 보낸다.
- demultiplexing : network layer가 받은 packet의 header를 떼서 destination socket에게 분배하는 것이다. 이 때 header에 있는 port를 보고 판별한다.
Segment Format
segment는 위와 같이 생겼다.
이 때, 실제 전송 과정에는에는 IP address와 port가 필요하지만 segment에는 port만 있다. transport layer에서 port를 붙이고, network layer에서 IP address를 붙인다.
UDP의 경우 port가 코드에는 나타나지 않지만 OS, transport layer가 관리하고 있으므로 이것을 사용한다.
UDP demultiplexing
- 생성된 socket은 port를 가지고 있다.
- UDP로 packet을 전송할 때는 destination IP address와 port를 가지고 있다.
- host가 UDP로 packet을 받으면 segment header에 있는 port를 보고 해당하는 socket으로 packet을 전달한다. - 이를 demultiplexing이라 한다. UDP의 경우 port만 보고 demultiplexing이 일어난다!
- 이 때 여러 packet의 destination port가 같은 경우 같은 socket으로 들어간다.
- UDP의 경우 socket을 하나만 쓴다. 때문에 여러 client로부터 온 정보들이 하나의 port, 즉 하나의 socket에 모인다.
예시
UDP의 경우 demultiplexing의 예시이다. UDP의 경우 server port는 하나만 있다. 때문에 여러 client들로부터 온 packet들이 하나의 socket으로 모인다.
TCP demultiplexing
TCP의 경우, [source IP address, source port, destination IP address, destination port] 4개 정보를 이용해 socket을 식별한다. 4가지 정보를 사용하는 이유는 다음과 같다.
- conneciton 직전, door socket은 contact가 오면 door socket을 복사해 client 전용 socket을 별도로 연다.
- destination IP address를 사용해 host 여부를 판단하고, destination port를 사용해 어떤 process인지 판단한다.
- 그러나 한 process에 connection이 여러 개인 경우 socket이 여러 개 있기 때문에 port로 식별할 수 없다. 때문에 어떤 client로부터 왔는지 구분하기 위해 source IP address, source port도 추가로 사용해 식별해야 한다.
예시
위 그림을 보면 알 수 있듯, 모든 client에서 보내는 packet에 destination port가 80으로 똑같다. 때문에 source IP address, source port를 추가적으로 사용해 port를 식별해야 한다.
정리
요약하면, UDP의 경우 application의 socket이 1개이다. 떄문에 port만 보고 socket을 식별할 수 있다.
반면, TCP의 경우 application socket이 여러 개이다. 따라서 port만으로 socket을 식별할 수 없다. 때문에 [source IP address, source port, destination IP address, destination port] 4개 정보를 사용한다.
UDP, Connectionless Transport
앞 포스팅들에서 간단하게 살펴 본 UDP에 대해 더욱 심층적으로 살펴보자.
UDP의 특징
- connectionless protocol : sender와 receiver가 handshaking을 하지 않는다. 각 segment를 independent하게 주고받는다.
- unreliable data transfer (best effort service) : 중간에 packet이 사라질 수도 있고, 순서가 맞지 않을 수도 있지만 UDP는 이런 것들을 신경쓰지 않는다.
- no frill : 추가적인 operation이 없기 때문에 전송 overhead가 낮고 빠르다. 상태 정보를 유지하지 않기 떄문에 header가 간단하다.
- no congestion control : congestion control을 하지 않으므로 application이 만드는 속도로 packet을 발송할 수 있다.
이러한 특징들로 인해 다음과 같은 경우에 UDP를 사용한다.
- rate sensitive한 경우 : streaming multimedia와 같은 경우 loss tolerant하지만 전송 속도가 훨씬 중요하기 때문에 UDP를 쓴다.
- packet이 사라져도 괜찮은 경우 : 위와 같은 경우이다.
- periodically하게 정보를 주고받는 경우 : SNMP와 같은 network 관리 protocol의 경우, 주기적으로 최신 정보를 갱신하기 때문에 data가 사라져도 다음 갱신에서 수정된다.
- 1회성으로 정보를 주고받는 경우 : DNS와 같은 경우 1회성 connection이기 때문에 가벼운 UDP를 쓴다.
UDP header
UDP header는 위와 같이 생겼다.
- port : UDP는 multiplexing과 demultiplexing만 지원하면 되므로 port만 가지고 있으면 된다.
- length : UDP header는 fixed이고, data만 가변이다. 따라서 payload의 길이를 식별하기 위해 segment length가 필요하다.
하나 의문을 가질 수 있는 점은, UDP는 unreliable data transfer인데 checksum을 감지해서 어디다가 사용할까? UDP는 단순히 packet 오류를 감지하는 목적으로만 사용하고, 이를 어떻게 처리할지는 설정에 달렸다. 예를 들면 UDP가 packet 오류가 생겼다는 것을 알리면서 application layer에 통지할 수도 있고, 아니면 UDP가 버려버릴 수도 있다.
Checksum
checksum은 error를 감지하는 수단 중 하나이며 아래와 같은 알고리즘으로 만든다.
- segment를 16bit integer의 나열로 보고, 모든 integer를 더한다.
- carrry(올림)이 발생할 경우에는 더한다.
- 그러면 16bit 숫자가 하나 만들어지는데, 여기에 1's complement를 하면 checksum이 만들어진다.
sender는 checksum을 계산해 header에 넣고, receiver도 동일한 방식으로 checksum을 계산한다. 만약 header에 있는 checksum과 계산한 값이 달라진다면 error가 발생했다는 것을 알 수 있다. 그러나 checksum이 모든 error를 찾아 주는 것은 아니다!
잘못된 내용이나 오탈자에 대한 지적, 질문 등은 언제나 환영합니다.