TCP Connection
TCP 는 connection-oriented protocol 이다. 데이터 교환 전에 반드시 "handshake" 를 통해 TCP connection 을 생성한다.
TCP connection 은 full-duplex service 를 제공한다. 프로세스 간 TCP connection 이 있다면, 프로세스 간 양방향 통신(bi-directional data flow)이 가능하다. 또한, TCP connection 은 항상 single sender 와 single receiver 를 가지는 point-to-point 이다.
TCP connection 이 생성되면, 두 application process 가 서로 데이터를 보낼 수 있게 된다. client process 가 server process 로 데이터를 보낸다고 생각해보자. 참고로, connection 을 시작하려는 process 를 clinet process, 다른 process 를 server process 라고 한다.
- client process 는 socket 을 통해 stream of data 를 전달한다.
- data 가 socket 을 지나면 data 는 TCP 에 의해 관리된다.
- TCP 는 이 데이터를 connections 의 send buffer 로 보낸다.
- 때때로, TCP 는 send buffer 에서 chucks of data 를 가져와 network layer 로 보낸다. send buffer 에서 가져와 segment 에 놓을 수 있는 최대 데이터 양은 MSS(Maximum Segment Size) 에 의해 제한된다.
- TCP 는 chunk of clinet data 에 TCP header 를 붙여 TCP segments 를 만든다.
- segments 는 network layer 로 보내지고, network-layer IP datagrams 로 캡슐화 되어 network 로 보내진다.
- TCP 가 다른 쪽에서 segemnt 를 받으면, segment 의 데이터는 TCP connecion 의 receive buffer 에 놓여진다.
- application 은 이 buffer 를 통해 stream of data 를 읽는다.
MSS 와 MTU
local sending host 에 의해 전달되는 가장 긴 link-layer frame 의 길이인 MTU(Maximum Transmission Unit) 를 결정한 후, TCP segment 와 TCP/IP header length(보통 40bytes) 의 합이 single link-layer frame 에 맞도록 MSS 를 결정한다. link-layer protocol 인 Ethernet 과 PPP 의 MTU 값이 1500 bytes 이므로, MSS 의 값은 일반적으로 1460 bytes 가 된다.
참고로 MSS 는 segment 의 maximum amount of application-layer data 이며, header 를 포함한 TCP segment 의 maximum size 가 아니다
TCP Segmentation Structure
TCP segment 는 header fields 와 data field 로 구성되어 있다. MSS 는 segment 의 data field 의 maximum size 를 제한하한다. 따라서, TCP 가 large file 을 보낼 때는 file 을 MSS size 로 쪼개서 보낸다.
TCP segment header 에는 다음과 같은 fileds 가 존재한다.
- 16-bit source/destination port number field : multiiplexing/demultiplexing 시에 사용된다.
- 32-bit sequence/acknowldegment number field : reliable data transfer service 를 구현하기 위해 TCP sender 와 receiver 가 사용한다.
- 16-bit receive window field : flow contorl 시 사용하며 receiver 가 받을 수 있는 bytes 수를 나타낸다.
- 4-bit header length field : TCP header 의 길이를 나타낸다. TCP header 는 TCP option field 때문에 길이가 변할 수 있다. 일반적으로 options field 는 비어있어 TCP header 의 길이는 20 bytes 이다.
- optional & variable-length options field : sender 와 receiver 가 MSS 를 결정하거나 window scaling factor 로 사용한다.
- flag field : 6 bits 로 이루어져 있다.
- ACK bit : acknowledgement field 에 있는 값이 valid 하다고 알려준다. 즉, 해당 segment 가 receiver 측에서 성공적으로 segment 를 받았다는 ackowlegment 를 포함하고 있다는 뜻이다.
- RST, SYN, FIN bit : connection setup 과 teardown 시 사용한다.
- PSH, URG bit : 보통 사용되지 않는 bit 들이다. PSH bit 는 receiver 에게 upper layer 로 즉시 data 를 전송하라고 지시하고, URG bit 는 segment 에 sending-side upper layer 에서 "urgent" 라고 표시한 데이터가 있다고 알려준다.
- 16-bit checksum field : UDP checksum 처럼 송신 중 발생할 수 있는 비트 오류를 체크한다..
Sequence Numbers and Acknowledge Numbers
TCP segment header 에서 가장 중요한 두 filed 는 sequence number field 와 acknowledge number field 로, TCP's reliable data transfer service 의 핵심 부분이다. TCP 는 data 를 unstructured, ordered stream of bytes 로 바라본다. segment 의 sequence number 는 segement 의 첫 번째 byte-stream number 이다.
예를 들어, file 이 500,000 bytes, MSS 가 1000 bytes, data stream 의 first byte 가 0 이라고 하자. TCP 는 5000 개의 segments 를 생성하며 첫 번째 segemt 의 sequence number 는 0, 두 번째 segment 의 sequence number 는 1,000, 세 번째 segment 의 sequence number 는 2,000 이 된다.
segment 의 acknowlegement number 는 다른 쪽에서 보낼 것이라 예상되는 next byte 의 sequence number 이다.
예를 들어, Host B 가 Host A 에게 0 bytes 부터 535 bytes 를 포함하는 segment 를 보냈다고 하자. Host A 는 Host B 로부터 byte 536 을 받을 것이라 예상하므로, Host A 는 segment 의 acknowledge number field 에 536 을 입력하여 Host B 에 보낸다.
TCP 는 cumulative acknowledgments 를 제공한다. 예를 들어, Host B 가 Host A 에게 0 bytes 부터 535 bytes 를 포함하는 segment 와 900 bytes 부터 1000 bytes 를 포함하는 segment 를 보냈다고 하자. Host A 는 bytes 536 ~ 899 를 받지 않아 Host A 는 byte 536 을 기다리므로, Host A 는 segment 의 acknowledge number field 에 536 을 입력하여 Host B 에 보낸다.
참고로, TCP 는 out-of-rder sgements 를 받았을 때 어떤 행동을 할 지 정해진 규칙이 없어 프로그래머가 선택해야한다. 일반적으로 (1) out-of-segments 를 즉시 무시하는 방법과 (2) missing bytes 를 채워지기를 기다리는 방법을 사용한다, network bandwitdh 관점에서 후자의 방법이 더 효율적이다.
Round-Trip Time Estimation and Timeout
TCP 는 lost segments 를 회복하기 위해 timeout/retransmit mechanism 을 사용한다. timeout/retransmit mechanism 을 구현하기 위해 timeout interval 의 길이를 설정해야한다. timeout 은 반드시 RTT(Round-trip time) 보다 길어야 하는데, RTT 는 상수값이 아닌 유동적인 값이라는 문제가 있다. timeout 을 너무 짧게 설정하면 이른 timeout 으로 인해 불필요한 retransmission 을 보내게 되고, timeout 을 너무 길게 설정하면 segment loss 에 늦게 반응하는 문제가 생긴다.
TCP 는 RTT 를 측정하기 위해 SampleRTT 라는 값을 사용한다. SampleRTT 는 segement 의 전송부터 ACK receipt 까지측정한 시간이다. retransmission 에 대한 SampleRTT 는 계산하지 않는다. SampleRTT 는 segment 마다 값이 변동적이다. 일반적인 RTT 를 측정하기 위해, TCP 는 SampleRTT 의 평균값인 EstimatedRTT 를 측정한다. TCP 는 아래 공식을 사용하여 Estimated RTT 의 값을 구한다.
EstimatedRTT=(1−α)⋅EstimatedRTT+α⋅SampleRTT
timeout interval 은 EstimatedRTT 에 "safety margin" 을 더하여 구한다. 따라서 timeout interval 은 아래 공식을 사용하여 구한다.
TimeoutInterval=EstimatedRTT+4⋅DevRTT
* DevRTT=(1−β)⋅DevRTT+β⋅|SampleRTT−EstimatedRTT|
참조
Computer Networking _ A Top Down Approach, 7th, converted
'COMPUTER SCIENCE > Network' 카테고리의 다른 글
[Network] Network Layer - Overview (0) | 2023.01.23 |
---|---|
[Network] Transport Layer - TCP : Connection-Oriented Transport - (2) (0) | 2023.01.16 |
[Network] Transport Layer - Principle of Reliable Data Transfer (0) | 2023.01.06 |
[Network] Transport Layer - Connectionless Transport: UDP (0) | 2022.12.08 |
[Network] Transport Layer - Service and Multiplexing & Demultiplexing (0) | 2022.11.30 |
댓글