티스토리 뷰
Unix Network Programming의 챕터2 The Transport Layer: TCP, UDP, and SCTP
1. Introduction
TCP, UDP, SCTP는 Transport Layer에 속하며 Nework Layer의 IPv4또는 IPv6를 사용한다.
UDP는 신뢰할 수 없는 데이터그램 프로토콜이지만, TCP는 신뢰할 수 있는 byte-stream 프로토콜이다.
SCTP는 TCP와 유사하게 신뢰할 수 있는 프로토콜이지만 데이터 경계를 가지고 있고 transport layer에서 제공해주는 multihoming과 head-of-line blocking을 제공해준다.
2. The Big Picture
[그림 1] Overview of TCP/IP Protocols
그림 1은 프로토콜의 도식화를 나타낸 것이다.
Transport Layer를 거치지 않고 Network나 Datalink Layer로 바로 통신하는 것은 나중에 알아보도록 한다.
예를 들면 맨 왼쪽의 tcpdump는 Datalink로 바로 통신하기 위해 BSD packet filter(BPF) 또는 datalink provider interface(DLPI)를 사용하고 있다.
아래는 각 프로토콜에 대한 설명이다.
1) IPv4
Internet Protocol version 4의 줄임말이다.
32-bit 주소를 사용하고, TCP, UDP, SCTP, ICMP, IGMP를 위한 delivery service를 제공한다.
2) IPv6
Internet Protocol version 6의 줄임말이다.
128-bit 주소를 사용하고 IPv4의 대체용이다. TCP, UDP, SCTP, ICMPv6를 위한 delivery service를 제공한다.
3) TCP
Transmission Control Protocol의 줄임말이다.
TCP는 connection-oriented protocol로 신뢰성과 양방향(full-duplex) byte-stream을 제공한다.
acknowledgement, timeout, retransmission과 같은 신뢰성을 위한 디테일에 신경을 많이 썼다.
IPv4 또는 IPv6를 사용한다.
4) UDP
User Datagram Protocol의 줄임말이다.
UDP는 비연결 프로토콜이고 신뢰성이 없다.
TCP와 마찬가지로 IPv4 또는 IPv6를 사용한다.
5) SCTP
Stream Control Transmission Protocol의 줄임말이다.
SCTP는 TCP와 마찬가지로 connection-oriented protocol로 신뢰성과 양방향 association을 제공한다.
association은 SCTP연결에서 사용되는 말인데 multihoming때문에 그렇다.
multihoming은 여러개의 IP 주소와 각 association에 해당하는 port와 관련있다.
SCTP는 message service를 제공하며 데이터 경계가 존재한다. TCP, UDP와 마찬가지로 SCTP는 IPv4 또는 IPv6를 사용한다.
그렇지만 SCP는 둘 모두를 같은 association에서 동시에 사용할 수 있다.
6) ICMP
Internet Control Message Protocol의 줄임말이다.
ICMP는 router와 host 사이에서 error와 control information을 다룬다.
이러한 message는 보통 TCP/IP networking software에서 발생한다.
ICMPv6와 구별하기 위해 ICMPv4라고 표현한다.
7) IGMP
Internet Group Management Protocol의 줄임말이다.
IGMP는 multicasting을 할 때 사용한다. 옵션이 있는 IPv4를 사용한다.(optional with IPv4??)
8) ARP
Address Resolution Protocol의 줄임말이다.
ARP는 hardware address를 IPv4 address에 매칭한다.
보통 broadcast networks(Ethernet, token ring, FDDI)에서 사용되며 point-to-point network에선 필요없다.
9) RARP
Reverse Address Resolution Protocol의 줄임말이다.
RARP는 hardware address를 IPv4 address에 매칭한다.
diskless node가 부팅할 때 종종 사용된다.
10) ICMPv6
Internet Control Message Protocol version 6의 줄임말이다.
ICMPv6는 ICMPv4와 IGMP, ARP가 기능적으로 합쳐진 것이다.
11) BPF
BSD packet filter의 줄임말이다.
BPF interface는 datalink layer로 접근하기 위한 기능을 제공한다.
보통 Berkeley-derived kernels에서 발견된다.
12) DLPI
Datalink provider interface의 줄임말이다.
DLPI interface도 datalink layer로 접근하기 위한 기능을 제공한다.
보통 SVR4에 공급된다.
3. User Datagram Protocol (UDP)
간단한 transport layer protocol이다.
어플리케이션이 UDP 소켓에 메시지를 쓰면 UDP datagram으로 캡슐화하고 IP datagram으로 더 캡슐화된 다음, 목적지로 전송된다.
목적지에 제대로 도달할지, 순서가 바뀔지, 한번만 도착할지는 보장하지 않는다.
따라서 UDP는 신뢰성이 없고 에러가 발생하거나 누락되는 일이 일어나면 재전송되지 않는다.
신뢰성을 보장하려면 유저가 acknowledgement, timeout과 retrasmission 등을 정의해야한다.
UDP는 데이터 앞에 길이를 함께 보내서 데이터 경계가 있다.
또한 UDP는 connectionless service를 제공한다. 그래서 udp 클라이언트는 하나의 udp 소켓으로 datagram을 여러군데의 서버에 동시에 보낼 수 있다. 서버도 마찬가지로 여러 클라이언트에서 동시에 데이터를 받을 수 있다.
4. Transmission Control Protocol (TCP)
TCP는 서버와 클라이언트의 연결과 신뢰성을 제공한다.
신뢰성을 위해 TCP는 데이터 전송시 ack를 받기를 기다리며 timeout 되면 데이터를 재전송한다.
몇 번의 재전송 후(4~10분 정도)에도 ack를 못 받으면 포기하고 연결을 끊는다.
TCP는 round-trip time(RTT) 알고리즘을 가지고 있으며 client와 server 사이에서 동적으로 계산한다.
RTT를 계산하는 이유는 ack를 얼마만큼 계산하는지 알아내고 네트워크 트레픽을 조사하기 위해서이다.
TCP는 데이터 순서를 같이 보낸다.
TCP가 데이터를 받을 때 순서가 잘못되면 재배열 후에 application에 전달한다.
만약 TCP가 데이터가 손실되지 않은 상황에서 네트워크 트래픽때문에 2번 이상 같은 데이터를 전송받으면 duplicate된 데이터임을 알아차리고 duplicate된 데이터를 폐기한다. (sequence를 통해)
TCP는 flow control을 제공한다.
TCP는 매번 peer에게 몇 바이트를 받을 수 있는지 알려준다. 이것은 advertised window라고 불린다.
window는 receive buffer에서 현재 몇 바이트가 이용가능한지 알려준다. 따라서 sender는 receive buffer를 overflow 할 수 없다.
데이터가 sender로부터 오면 window는 작아진다. 반대로 receiving application이 데이터를 buffer로부터 읽으면 window는 커진다.
window가 0이면 receive socket의 buffer가 꽉찬것을 의미하며 sender는 receiving application이 데이터를 읽을때까지 기다려야한다.
마지막으로 TCP connection은 full-duplex이다.
이것은 하나의 소켓으로 양방향으로 통신이 가능함을 의미한다. (send, receive)
따라서 TCP는 sequence number와 windows size를 각 방향의 data flow마다 기록을 해야한다.
full-duplex로 연결이 된 다음, 단방향으로 바꿀 수 있다.
5. Stream Control Transmission Protocol (SCTP)
SCTP는 TCP와 UDP에서 제공해주는 서비스와 유사하다.
SCTP는 client와 server 사이에 association을 제공해준다.
SCTP는 TCP처럼 신뢰성과 데이터 순서, flow control, full-duplex 데이터 전송을 제공해준다.
association은 SCTP에서 connection 대신 사용되는 말로 TCP에서 오직 2개의 IP끼리만 연결된 의미와 구분하기 위해서 사용한다.
association은 multihoming때문에 두개 이상의 주소를 가지는 시스템끼리의 통신과 관련있다.
TCP와 다르게 SCTP는 message-oriented이다.
각각의 메시지마다 sequence가 매겨지고(TCP처럼) 길이가 같이 전송된다.(UDP처럼)
SCTP는 connection endpoint 사이에 다수의 stream을 제공한다.
각각의 stream은 그 stream만의 신뢰성있는 sequenced delivery를 제공한다.
만약 이 다수의 stream 중 하나가 메시지를 손실해도 다른 stream을 block하지 않는다. 이것은 TCP와 반대되는 개념이다.
SCTP는 multihoming을 제공한다. multihoming은 한개의 SCTP endpoint에서 다수의 IP 주소를 지원하는 것을 의미한다.
이러한 특징은 network failure에 대해 강하도록 해준다.
SCTP의 endpoint는 internet에 연결된 불필요한 주소들이 있을 수 있다. network failure가 발생하면 SCTP에 할당된 다른 IP주소로 전환해 복구할 수 있다.
TCP routing protocol도 위와 유사한 이익을 볼 수 있지만 연결된 두개의 router가 고장나면 사용못한다. 또한 SCTP는 할당된 IP주소 각각을 다른 서비스로 제공할 수 있지만 routing-based TCP는 그렇지 않다.
6. TCP Connection Establishment and Termination
1) Three-Way Handshake
밑의 시나리오는 TCP connection이 설립될 때 일어나는 것이다.
1> server는 도착하는 연결을 받기위해 준비해야한다. 보통 socket, bind, listen 함수를 호출함으로써 준비된다. (이 세 함수를 부르는 것을 passive open이라고 함)
2> client는 connect를 호출함으로써 active open을 해야한다. 이 함수는 TCP client가 server에게 "synchronize"(SYN) segment를 보내드록 하며 서버는 이것을 통해 sequence number를 알게된다. (데이터 순서를 나타내는 지표)
SYN은 보통 IP header와 TCP header 그리고 가능한 TCP option들이 포함돼있다.
3> server는 client의 SYN에 대해 알림의 표시(ACK)를 보내야하며, sequence number가 포함된 SYN도 같이 client에 보낸다. (양방향 통신이기 때문)
4> client는 server의 SYN에 대해 알림의 표시(ACK)를 보내야한다.
[그림 2] TCP three-way handshake
그림 2와 같이 연결 수립을 위해 최소한 3개의 패킷을 주고받아야하며 이것을 three-way handshake라 부른다.
그림 2에서는 client의 초기 sequence number는 J, server는 K라고 가정하였다.
이 three-way handshake는 전화 시스템에 비유한 것이다.
socket 함수는 전화기를 새로 가지는 것과 같고, bind는 전화번호를 부여하고 사람들에게 알려주는 것과 같고, listen은 전화 수신을 기다리기 시작하는 것과 같다.
client의 connect는 전화를 거는 것과 같다. 전화를 걸때와 마찬가지로 identity가 있어야하는데 여기선 IP주소와 port이다.
server는 accept를 통해 전화를 받는 행동과 같은 행동을 취할 수 있다. 전화를 받는 것과 다른점은 전화기는 전화를 받기전에 발신자의 identity를 알 수 있는 반면 TCP에서는 connection이 수립되고 나서 accept함수가 identity를 return한다는 점이 다르다.
2) TCP Options
SYN은 TCP option들을 포함하고 있다. 자주 사용되는 옵션들은 아래와 같다.
1> MSS option
각 SYN마다 이 옵션을 통해 maximum segment size를 보낸다. (얼마만큼의 데이터를 최대로 받을지)
TCP는 receiver의 MSS 값을 통해 보낼때 maximum segment size를 참고한다.
2> Window scale option
TCP의 maximum window size(buffer size)는 65535이다. 그러나 요즘같이 빠르거나 긴 딜레이의(위성 통신처럼) 통신에선 처리량을 극대화 하기 위해 더 큰 window가 필요하게 되었다.
0~14를 옵션으로 줄 수 있으며, 이 옵션으로 maximum window가 거의 1기가바이트까지 늘어날 수 있게되었다. (65,535 * 2^14)
연결될 두 endpoint가 모두 이 옵션을 지원해야지만 사용할 수 있다.
3> Timestamp option
이 옵션은 high-speed connection을 위해 존재한다.
이 옵션은 오래되거나 지연되거나 중복된 요소들에 의해 발생되는 corruption을 막는다.
Window scale option처럼 만든지 얼마 안된 옵션이기 때문에 연결될 두 endpoint가 모두 이 옵션을 지원하는지 확인해야한다.
3) TCP Connection Termination
connection을 해제하기 위해선 4개의 segment가 필요하다.
1> application에서 close가 호출되면 active close를 수행한다. close를 호출한 endpoint의 TCP는 데이터 송신을 멈추라는 의미의 FIN segment를 보낸다.
2> FIN을 수신한 다른 endpoint에서는 passive close를 수행한다. FIN을 수신하면 TCP가 FIN에 대한 ACK를 보낸다. 또한 FIN은 end-of-file로 application에 처리되는데, end-of-file은 queue에 남아있는 이미 수신한 데이터끝에 존재하게 되고 end-of-file이후부터는 더 이상 수신하지도, 수신하더라도 처리하지 않는다.
3> application이 end-of-file을 수신하면 socket을 close한다.(passive로) 이것은 active close가 수행되고 있는 endpoint에 FIN을 보낸다.
4> active close를 수행하는 endpoint의 TCP는 마지막 FIN을 수신하고 이 FIN에 대한 ACK를 보낸다.
[그림 3] Packet exchanged when a TCP connection is closed
2번째와 3번째 단계 사이에서 passive close가 일어나는 endpoint에서 active close가 일어나는 endpoint로 데이터를 전송할 수 있다. 이를 half-close라고 하며 나중에 shutdown함수와 함께 알아볼 것이다.
FIN은 socket이 close 될 때 일어난다. close함수를 호출할 때 말고도 자발적으로(exit함수를 호출하거나 main 함수 return) 또는 비자발적으로(process를 terminate하라는 신호를 받았을 때) 또는 모든 descriptor가 닫혀도 FIN이 보내지게 된다.
그림 3과 같이 보통 client가 active close를 하지만 몇몇 프로토콜에서는(HTTP/1.0 등) 서버가 active close를 수행한다.
4) TCP State Transition Diagram
그림 4와 같이 TCP의 연결 수립/해제 과정은 state transition diagram으로 명시할 수 있다.
[그림 4] TCP state transition diagram
그림 4는 TCP에서 11가지 다른 state를 명시한 것이다. 현재 state와 수신된 segment에 따라 state는 다른 state로 이동할 수 있다.
예를 들어 application이 active open을 CLOSED state에서 하게 되면 TCP는 SYN을 보내고 SYN_SENT state가 된다. 그 후 TCP가 SYN과 ACK를 받게되면, ACK를 보내고 ESTABLISHED state가 되게 된다.
그림 4에서는 client transition을 굵은 선으로, server transition을 굵은 점선으로 나타냈다.
동시에 open(SYN 동시에 send)이나 동시에 close(FIN 동시에 send)와 같은 특이한 상태는 나중에 알아보도록 한다.
state transition diagram을 보여주는 이유는 11가지 TCP state때문이며 이 state는 netstat으로 출력할 수 있다. netstat은 client/server application에서 디버깅을 할 때 유용하게 사용된다.
5) Watching the Packets
그림 5는 TCP에서 연결 수립, 데이터 전송, 연결 해제 시 패킷 교환과 state를 나타낸다.
[그림 5] Packet exchange for TCP connection
그림 5의 예제에서는 client의 MSS(maximum segment size)는 536, server의 MSS는 1460이라고 알리고 있다.
각 방향의 MSS가 달라도 상관없다.
connection이 수립되고 client가 하나의 request segment를 날린다. (여기선 1,460 bytes 미만이라고 가정) 서버는 request를 처리하고 하나의 reply segment를 날린다. (여기선 536 bytes 미만이라고 가정)
request에 대한 ACK를 reply와 함께 보내는 것을 볼 수 있는데 이것을 piggybacking이라고 한다.
보통 request를 처리하고 reply를 만드는데 200ms 아래면 ACK와 reply를 같이보내게 되고 그보다 더 오래걸리면 ACK를 먼저 보내고 그 후에 reply를 보낸다.
그림 5의 예제와 같이 한개의 request segment를 보내고 한개의 reply 받는 것이 목적이라면 총 8개의 overhead가 TCP때문에 생기게 되는 것이다. UDP를 사용하게 된다면 오직 request와 reply packet만 존재하게 된다.
그렇지만 이렇게 되면 데이터에 신뢰성이 없어지고 혼잡 제어가 없어지게 된다.
UDP는 이러한 장점이 없지만 overhead가 없기때문에 적은 양의 데이터 통신에서는 좋다.
'프로그래밍 > Network' 카테고리의 다른 글
Socket Introduction (2) (0) | 2017.05.22 |
---|---|
Socket Introduction (1) (0) | 2017.04.05 |
Transport Layer (3) (0) | 2017.03.13 |
Transport Layer (2) (0) | 2017.02.24 |
TCP UDP 통신 (0) | 2017.01.17 |
- Total
- Today
- Yesterday
- spring batch
- Tasklet
- npm
- 클로저
- Express
- @Autowired
- Closure
- Check point within polygon
- @Bean
- @Component
- chunk
- @Qualifier
- unity
- spring
- Barycentric coordinates
- Linux
- mybatis
- Bean
- MySQL
- thymeleaf cannot resolve
- nodejs
- JavaScript
- thymeleaf 변수 인식
- Bin
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |