Transcript TCP(RFC793)

TRANSMISSION CONTROL PROTOCOL
(TCP)
2008.10
본 자료는 TCP의 역할과 동작에 관한 개요를 살펴보기 위한 목적으로 작성 되었으며,
TCP를 정의하고 있는 RFC793 중 다음 내용은 본 자료에서 제외 되었음
• ‘2. PHILOSOPHY’: TCP 동작의 기본 철학이며 이를 구체화한 내용은 이 자료에서 cover하고 있음
• ‘3.8 Interfaces’: TCP와 다른 layer 사이의 interface를 정의
• ‘3.9 Event Processing’: TCP와 state와 event에 따른 처리를 구체적으로 정의
Contents
 Introductions
– Motivation
– Scope
– Operation
 Header Format
– TCP protocol header
– Header fields
 Terminology
–
–
–
–
–
–
Transmission Control Block (TCB)
Send sequence variables
Receive sequence variables
Current segment variables
Connection states
Events
 TCP connection state diagram
2
Contents
 Sequence Numbers
–
–
–
–
–
–
Sequence number and acknowledgement
Sequence number space
Sequence number comparison
Initial Sequence Number (ISN) selection
Knowing when to keep quiet
The TCP quiet time concept
–
–
–
–
–
–
–
–
–
–
Basic 3-way handshake
Simultaneous connection synchronization
Recovery from old duplicate SYN
Half-open connections
Half-open connection discovery
Active side causes half-open connection discovery
Old duplicate SYN
Reset generation
States for reset
Reset processing
 Establishing A Connection
3
Contents
 Closing A Connection
–
–
–
–
Close
Close
Close
Close
operation
case 1: Local user initiates the close
case 2: TCP receives a FIN from the network
case 3: Both users close simultaneously
 Precedence and Security
– Security/Compartment
– Rejecting a connection
– Sending security parameters
 Data Communication
–
–
–
–
Data transmission
Retransmission timeout
The communication of urgent information
Managing the window
 References
4
Introduction
 Motivation
– Packet Switching (PS) 망에서 신뢰성 있는 전송을 하기 위해 만
들어짐 (RFC 793, Sep. 1981)
– Internet Protocol(IP) 바로 위의 layer에서 동작
 IP의 역할
• TCP가 다양한 길이의 data segment를 internet datagram envelope에
담아 송수신 할 수 있게 해줌
• Internet datagram은 서로 다른 종류의 network에 있는 송신자와 수신
자가 서로를 찾을 수 있는 방법을 제공
• 여러 가지 network과 gateway를 통해 TCP segment가 전달되기 위해
필요한 fragmentation과 reassembly 작업을 수행
• 운반되는 TCP segment의 구분, 우선순위, 보안 등급에 관련된 정보를
포함
 Scope
– 다양한 network 환경에서 process와 process 사이의 신뢰성 있는
통신 서비스를 제공
– 복수의 network에서 일반적으로 사용될 수 있는 host-to-host
protocol
5
Introduction

Operation
– Basic Data Transfer
 일정 수의 octet들을 TCP segment로 묶어 internet system 상에서 양방향으로 연속된
octet stream을 전송할 수 있음
 송신자가 TCP로 넘긴 모든 data가 즉시 송신되고, 수신 쪽에서도 즉시 수신자에게 넘겨
지도록 하기 위한 push 기능을 제공
– Reliability
 Sequence Number, Positive Acknowledgement, Checksum을 사용하여 전송 과정에서
일어나는 data의 손실, 중복, 순서 변경을 바로잡음
– Flow Control
 수신 TCP는 ACK에 “window” 값을 담아 회신함으로써 송신 TCP가 data를 송신하는 양
을 조절
– Multiplexing
 하나의 host에 있는 여러 개의 process가 TCP를 동시에 사용할 수 있도록 하기 위해
port 번호를 사용
 IP layer의 주소와 TCP layer의 port 조합이 socket을 이룸
 많이 쓰이는 특정 socket들은 번호가 고정 되어 널리 알려져 있음
– Connections
 Reliability나 Flow Control을 제공하기 위해서는 각 data stream의 상태 정보를 초기화
하고 유지해야 하며 Connection이 이를 제공
 각 Connection은 송신 socket과 수신 socket의 쌍으로 이루어짐
– Precedence and Security
 TCP user는 Precedence와 Security에 대한 정보를 표시해야 하나, 이들을 사용하지 않는
경우에 대비해 default value가 제공 됨
 현실적으로는 IP에서 이 기능들을 거의 사용하지 않으므로 TCP도 사용하지 않음
6
Header Format
 TCP protocol header
– TCP segment는 internet datagram으로 전송
– IP header는 source, destination 주소를 비롯한 여러 가지 정보
를 포함
– IP header 뒤에 TCP에 관련된 정보를 가진 header를 붙임
7
Header Format
 Header Fields
– Source Port (16 bits)
 Source port number
– Destination Port (16 bits)
 Destination port number
– Sequence Number (32 bits)
 Segment의 첫 번째 data octet의 sequence number
 ‘SYN’이 포함 된 경우는 예외
• SYN의 sequence number는 initial sequence number (ISN)이며 첫 번째
data octet은 ISN+1
– Acknowledge Number (32 bits)
 ACK control bit이 켜져 있는 경우 이 번호는 ack의 송신자가 다음 수신
할 sequence number를 나타냄
 Connection이 맺어진 다음부터는 이 값을 항상 보냄
– Data Offset (4 bits)
 32 bit word 단위로 나타낸 TCP header의 길이로 data가 시작되는 위치
를 가리킴
• TCP header의 길이는 항상 32 bit의 배수
8
Header Format
 Header Fields
– Reserved (6 bits)
 Reserved for future use
 항상 0으로 채움
– Control Bits (6 bits)






URG: Urgent Pointer field를 사용
ACK: Acknowledgement Number field를 사용
PSH: Push Function을 사용
RST: Connection을 reset
SYN: Sequence number를 동기화
FIN: 발신자는 보낼 data가 더 이상 없음
– Window (16 bits)
 송신자가 받아줄 수 있는 data octet의 수
 수신되는 data octet은 ack number field에 들어 있는 sequence number의 octet
부터 시작되어야 함
– Checksum (16 bits)
 TCP header와 data 전체를 16 bit 단위로 1의 보수의 합을 구하고, 그 결과의 1의
보수를 checksum 값으로 사용 (실제 구현에서는 같은 결과를 만드는 더 간단한
code를 사용)
 전체 octet 수가 홀수인 경우 0으로 padding하여 16 bit word를 맞춤
• Padding 된 octet은 checksum을 만드는 목적으로만 사용되고 실제로 전송 되지
는 않음
 Checksum 계산에 들어가는 TCP header의 checksum field는 0으로 채우고 계산
9
Header Format
 Header Fields
– Checksum (16 bits)
 TCP header 앞에 96 bit pseudo header를 붙여 checksum을 계산
• Source Address, Destination Address, Protocol은 IP header로부터 가
져옴
• TCP Length는 header와 data의 길이를 더하여 계산 (pseudo header 길
이는 포함하지 않음)
– Urgent Pointer (16 bits)
 Segment의 sequence number로부터의 offset
 긴급히 처리 해야 하는 data의 뒤에 오는 octet의 sequence number
를 나타냄
• 즉, 이 segment에 포함된 data의 첫 번째 octet부터 urgent pointer 바
로 앞 octet까지가 긴급히 처리해야 하는 data
 URG control bit가 켜진 경우에만 사용
10
Header Format
 Header Fields
– Options (variable)
 TCP header의 마지막에 오며 8 bit의 배수 길이
 두 가지 형태가 있음
• Case 1: octet 하나로 option-kind만 나타냄
• Case 2: option-kind (1 octet), option length (1 octet, length에는 kind와 length
2 octet도 포함), 실제 option data (variable)
 TCP는 정의된 모든 option을 구현해야 함 (RFC 793에 정의된 option은 모두 세 가
지)
 End of Option List (kind: 0, length: n/a)
• Option list의 끝을 나타내며 TCP header의 끝과 겹치는 경우에는 사용하지 않음
 No-Operation (kind: 1, length: n/a)
• Option들 사이에서 다음 option이 word 경계에 맞춰지도록 하기 위한 padding의
목적으로 사용
• 송신자가 이 option을 반드시 사용한다고 보장할 수는 없으므로 수신자는 option
들이 word 경계에 맞춰져 있지 않아도 처리할 수 있어야 함
 Maximum Segment Size (kind: 2, length: 4)
• 송신자가 수신할 수 있는 최대 segment size를 나타내며 이 option이 사용되지 않
은 경우 segment 크기는 제한 받지 않음
• 초기 connection 요청에만 포함 될 수 있음 (SYN control bit이 켜진 segment)
– Padding (variable)
 TCP header의 크기를 32 bit의 배수로 만들기 위해 0을 채움
11
Terminology
 Transmission Control Block (TCB)
– TCP connection을 유지하는 데 필요한 정보들을 가지고 있는 (가상의) 저장
공간
 Local & remote socket number, connection의 security와 precedence 정보, user
의 송신/수신 buffer pointer, 재전송 queue pointer, current segment pointer 등을
포함
 Send Sequence Variables
–
–
–
–
–
–
SND.UNA - send unacknowledged
SND.NXT - send next
SND.WND - send window
SND.UP - send urgent pointer
SND.WL1 - segment sequence number used for last window update
SND.WL2 - segment acknowledgment number used for last window
update
– ISS - initial send sequence number
12
Terminology
 Receive Sequence Variables
–
–
–
–
RCV.NXT - receive next
RCV.WND - receive window
RCV.UP - receive urgent pointer
IRS - initial receive sequence number
 Current Segment Variables
–
–
–
–
–
–
SEG.SEQ - segment sequence number
SEG.ACK - segment acknowledgment number
SEG.LEN - segment length
SEG.WND - segment window
SEG.UP - segment urgent pointer
SEG.PRC - segment precedence value
13
Terminology
 Connection States
– LISTEN
 다른 host로부터 연결 요청(SYN)이 들어오기를 기다리고 있는 상태
– SYN-SENT
 연결 요청을 보내고 그에 대한 응답 연결 요청(SYN, ACK)을 기다리고 있는 상태
– SYN-RECEIVED
 연결 요청을 받고 그에 대한 응답 연결 요청을 보낸 후, 연결 확인 ACK를 기다리
고 있는 상태
– ESTABLISHED
 Connection이 열린 상태
 Data 전송 단계의 normal state이며, 수신한 data를 user에게 전달할 수 있음
– FIN-WAIT-1
 연결 종료 요청을 보내고 그에 대한 ACK나 상대방으로부터의 연결 종료 요청이
오기를 기다리고 있는 상태
– FIN-WAIT-2
 송신한 연결 종료 요청에 대한 ack를 받은 후 상대 TCP로부터 연결 종료 요청이
오기를 기다리고 있는 상태
– CLOSE-WAIT
 상대 TCP로부터 받은 연결 종료 요청을 처리한 후 local user로부터 연결 종료 요
청이 오기를 기다리고 있는 상태
14
Terminology
 Connection States
– CLOSING
 상대 TCP와 연결 종료 요청을 주고 받았으며 그에 대한 ACK를 송신하고
상대로부터의 ACK를 기다리는 상태
– LAST-ACK
 상대 TCP가 보낸 연결 종료 요청에 대한 ACK를 보낸 후, 연결 종료 요청
을 보내고 이에 대한 최종 ACK를 기다리는 상태
– TIME-WAIT
 상대 TCP의 연결 종료 요청에 대해 마지막 ACK를 보내고 상대가 이를
받을 수 있도록 충분한 시간 동안 기다리는 상태
– CLOSED
 Connection이 완전히 종료 되어 아무 것도 없는 상태
 Events
– Connection State가 바뀌게 하며 다음 세 가지가 있음
– User Calls
 OPEN, SEND, RECEIVE, CLOSE, ABORT, STATUS
– Incoming Segments
 특히 SYN, ACK, RST, FIN과 같은 flag을 포함하는 segment
– Timeout
15
TCP Connection State Diagram
• 각 화살표의 설명은 ‘Event/Action’을 나타내며 Action 없이 state만 바뀌는 경우도 있음
• 초기 CLOSED 상태에서 들어오는 Active open event는 client로써 연결을 요청하는 경우, Passive
open event는 server로써 연결을 기다리는 경우를 나타냄
16
Sequence Numbers
 Sequence number and Acknowledgement
– TCP connection을 통해 전달되는 모든 octet은 sequence number를 가짐
– Cumulative ack를 사용
 Sequence number X에 대한 ack는 X보다 작은 sequence number의 모든 octet들
을 받았음을 나타냄 (X는 포함하지 않음)
 Sequence Number Space
– Field의 길이가 32 bits이므로 0부터 232-1까지의 범위를 가짐
 Modulo 232
 232-1 다음에는 0으로 되돌아 감
 Sequence number comparison
– 수신된 ack가 전송 후 아직 ack를 받지 못한 sequence number 중에 있는가
 SND.UNA < SEG.ACK =< SND.NXT
– Segment에 포함된 모든 sequence number들이 ack를 받았는가 (재전송
queue에서 segment를 제거 하는 것과 같은 경우에 필요)
– 수신된 segment의 sequence number가 올바른 범위 안에 있는가 (즉,
segment가 receive window에 포함 되는가)
 RCV.NXT =< SEG.SEQ < RCV.NXT+RCV.WND
 RCV.NXT =< SEG.SEQ+SEG.LEN-1 < RCV.NXT+RCV.WND
 Segment length나 receive window size가 0인 경우에는 이에 대한 고려가 추가로
필요
17
Sequence Numbers
 Initial Sequence Number (ISN) Selection
– 두 host 사이의 connection이 끊겼다가 동일 connection으로 새로
연결 됐을 때 sequence number의 문제
 앞의 connection에서 전송한 segment가 아직 network 상에 있고, 새로
운 connection에서 전송한 segment의 seq number가 앞의 segment와
중복 될 수 있음
 TCP가 seq number들을 보관하고 관리하는 방법도 있으나 connection
이 crash 되어 memory의 모든 정보를 잃게 되면 역시 문제가 발생
 문제를 막기 위해 어떤 seq number를 가진 segment가 network 상에 있
을 가능성이 있는 동안에는 동일 seq number를 가진 segment가 새로
전송되지 않도록 해야 함
– ISN generator
 새로운 connection을 연결할 때마다 ISN을 만들어 냄
 하위 bit이 약 4micro 초 마다 증가하는 (가상) 32bit clock과 연결
 ISN은 약 4.55시간 만에 한 바퀴 돌아가게 됨
 다음 가정에 따라 ISN은 unique 하다고 볼 수 있음
• Segment는 Maximum Segment Lifetime (MSL)보다 길게 network 상에 존재
하지 않음
• MSL은 4.55 시간보다 짧음
18
Sequence Numbers
 Initial Sequence Number (ISN) Selection
– Connection 초기화를 위한 seq number 동기화
 Initial send sequence number (ISS)는 송신 TCP가 선택하고, initial
receive sequence number (IRS)는 상대 TCP로부터 받음
 SYN control bit을 가진 segment에 자신의 ISN을 실어 host 간에 교
환함으로써 seq number 동기화가 이루어짐
 각 host는 자신의 ISN을 전송하고 그에 대한 ack를 받아야 함
1)
2)
3)
4)
A
A
A
A
-->
<-<--->
B
B
B
B
SYN
ACK
SYN
ACK
my sequence number is X
your sequence number is X
my sequence number is Y
your sequence number is Y
 Step 2, 3는 하나의 message로 전송 가능하므로 3 개의 message 교
환을 통해 seq number 동기화가 완료 됨 (3 way handshake)
 상대 host로부터 첫 번째 SYN을 수신 했을 때 거기 포함 된 seq
number가 새로운 것인지 이전 connection의 segment가 늦게 도착
한 것인지 판단이 불가능하므로, 수신 된 seq number를 ack를 통해
상대방에게 재확인하는 3 way handshake이 필요
19
Sequence Numbers
 Knowing When to Keep Quiet
– Network 상에서 seq number의 중복이 일어나지 않도록 TCP는
MSL 동안 기다렸다 seq number를 새로 만들어야 함
 새로운 connection을 만들거나, memory crash로 인해 이전 seq
number를 잃어버리고 전송을 재개하는 경우에는 MSL 동안 대기
 TCP가 이전 seq number를 유지하고 있는 경우에는 대기할 필요 없
이 이전보다 큰 seq number를 사용하기만 하면 됨
– RFC 793에서는 MSL을 2분으로 간주
 필요에 따라 변경 될 수 있음
 The TCP Quiet Time Concept
– Quiet Time Restriction
 사용된 seq number에 대한 정보를 잃어버린 경우에 최소 MSL 만큼
기다렸다가 전송을 재개해야 함
 TCP 구현에 따라 이러한 제한을 무시할 수도 있음
• 무시 되어야 할 오래된 data가 새로운 data로 취급 되거나, 새로운 data
가 오래된 data로 간주 되어 버려질 수 있는 위험은 감수해야 함
20
Sequence Numbers
 The TCP Quiet Time Concept
– Duplicate detection and sequencing algorithm의 전제 조건
 Segment의 data와 sequence space가 unique binding 되어야 정상적으
로 작동
 어떤 seq number를 가진 data가 상대 TCP에 전달 되어 ack를 받고, 그
data의 복사본들이 network 상에서 모두 사라지기 전에 seq number가
한 바퀴 돌아 같은 번호로 돌아와서는 안 됨
 이와 같이 동작하지 않으면 수신 TCP는 동일한, 혹은 겹치는 seq
number의 data 중 어느 쪽이 먼저 송신 된 것인지 알 수 없음
– Seq number의 순환 시간
 TCP는 seq number의 중복 사용을 막기 위해 다음 전송을 위한 seq
number와 ack를 기다리고 있는 가장 오래 된 seq number를 유지
• 이 방법만으로는 duplicate data가 network 상에서 모두 사라졌음을 보장할
수 없음
 Network에 남아 있던 duplicate data가 수신에 문제를 일으킬 가능성을
줄이기 위해 sequence space를 매우 크게 정의 (32 bits)
• 2Mbps에서 232 개의 seq number를 모두 사용하는 데 4.5 시간이 걸림
• MSL이 수십 초 정도를 넘지 않는다고 봤을 때, 이후에 사용 될 network에서
도 충분하다고 생각 됨
 100Mbps에서 seq number 순환 시간은 5.4분이며, 이는 약간 짧을 수도
있으나 여전히 쓸만함
21
Establishing A Connection
TCP A
TCP B
CLOSED
LISTEN
SYN-SENT
SYN-RECEIVED
ESTABLISHED
ESTABLISHED
 Basic 3-way handshake
– TCP A가 자신의 ISN이 100임을 알리는 SYN을 보냄
– TCP B가 상대의 SYN에 대한 ACK와 자신의 SYN을 보냄
 ACK field는 다음 수신할 sequence가 101임을 표시함으로써 sequence
100인 SYN을 받았음을 확인함
– TCP A가 상대의 SYN에 대한 ACK를 보냄
– TCP A가 data 전송을 시작
 ACK는 sequence space를 소비하지 않으므로 바로 앞의 ACK와 seq
number가 같음
22
Establishing A Connection
TCP A
TCP B
CLOSED
CLOSED
SYN-SENT
SYN-SENT
SYN-RECEIVED
SYN-RECEIVED
ESTABLISHED
ESTABLISHED
 Simultaneous Connection Synchronization
– 양 TCP 모두 CLOSED  SYN-SENT  SYN-RECEIVED 
ESTABLISHED의 순서를 거침
– SYN-SENT 상태에서 상대의 SYN을 받으면 이에 대한 ack를 전송
하고 SYN-RECEIVED 상태에서 자신의 SYN에 대한 ack를 계속 기
다림

RFC 793에서는 위와 같이 정리하고 있으나, 최초 양쪽에서 SYN을 주고 받은 다음 단순히 각각 ack만 보냄으로써
위의 절차보다 간단하게 연결이 성립되는 case를 보여주고 있는 자료도 찾을 수 있음
23
Establishing A Connection
TCP A
TCP B
CLOSED
LISTEN
SYN-SENT
SYN-RECEIVED
LISTEN
SYN-RECEIVED
ESTABLISHED
ESTABLISHED
 Recovery from Old Duplicate SYN
– LISTEN 상태인 TCP B에 TCP A가 이전에 송신한 duplicate SYN이 도착
 TCP B는 이 SYN이 duplicate인지 정상인지 판단할 수 없음
– TCP B는 정상적으로 SYN, ACK로 응답
– TCP A는 TCP B가 전송한 ACK가 비정상임을 확인하고 RST를 전송
 이 때 seq number는 비정상 ACK에 맞춰 줌
– TCP A가 보낸 정상 SYN이 TCP B에 도착하면 이후 정상 연결 과정 수행
– TCP A의 정상 SYN이 RST보다 먼저 TCP B에 도착하면 TCP B도 RST를 전송
하면서 좀 더 복잡한 과정이 진행
24
Establishing A Connection
 Half-Open Connections
– Connection이 한 쪽만 open된 상태
 한 쪽 TCP가 상대 TCP에게 알리지 않은 채로 close 되거나 abort 된
상태
 Memory crash 등의 이유로 양 TCP사이의 sync가 맞지 않게 된 상태
– 이 상태에서 어느 한 쪽이 data 전송을 data 전송을 시도하면
connection이 reset 됨
 Reset을 받은 쪽은 connection을 abort 해야 함
– Process A와 B가 통신 중에 A 쪽의 TCP가 crash 된 경우
 B는 A의 crash 사실을 모르므로 연결이 여전히 정상적이라고 생각함
 OS의 recovery에 의해 TCP가 다시 살아나면 A는 통신을 처음부터,
혹은 crash 된 시점부터 다시 시작하려고 시도
• OPEN 혹은 SEND를 시도
• SEND를 시도하는 경우에는 local TCP로부터 “connection not open”
error message를 받게 됨
 A가 connection을 새로 만들기 위해 SYN을 보내고, B는 연결에 문
제가 있는 것을 모르므로 data 전송을 계속하려고 함
25
Establishing A Connection
TCP A
(CRASH)
CLOSED
SYN-SENT
TCP B
(send 300,
receive 100)
ESTABLISHED
(??)
SYN-RECEIVED
(!!)
(abort!!)
CLOSED
 Half-Open Connection Discovery
– TCP B는 A로부터 받은 segment의 seq number(400)가 window 바깥에 있음
을 확인하고 자신이 다음 수신을 원하는 seq number를 알리는 ACK(100)를
전송
– TCP A는 수신한 ACK가 자신이 전송한 적 없는 seq number에 대한 ACK이며
현재 connection의 sync가 맞지 않음을 확인
– TCP A는 현재 connection이 half-open 상태임을 알고 RST를 전송하고 이를
수신한 TCP B는 connection을 abort 함
– TCP A는 새로운 connection 수립을 다시 시도하고 이후는 basic 3-way
handshake 과정을 따름
26
Establishing A Connection
TCP A
TCP B
(CRASH)
(send 300,
receive 100)
ESTABLISHED
(??)
(abort!!)
 Active Side Causes Half-Open Connection Discovery
– TCP A가 crash 된 후에 이를 모르는 TCP B가 data를 전송
– TCP A에게는 해당 connection이 존재하지 않으므로 RST 전송
– RST를 받은 TCP B는 connection abort
27
Establishing A Connection
TCP A
TCP B
LISTEN
LISTEN
SYN-RECEIVED
(??)
(return to LISTEN!)
LISTEN
 Old Duplicate SYN
– TCP A와 B 모두 SYN을 기다리는 LISTEN 상태
– 이전의 duplicate SYN을 수신한 TCP B가 그에 대한 SYN, ACK를
TCP A로 송신
– TCP A는 TCP B가 보낸 ACK가 올바르지 않음을 확인하고 RST를
전송
– TCP B는 RST를 받고 다시 LISTEN 상태로 돌아감
28
Establishing A Connection
 Reset Generation
– 다양한 예외 상황 발생이 가능하며 이는 정해진 RST generation and
processing 규칙에 따라 처리 됨
– 일반적으로 현재 connection과 분명 관계가 없는 것으로 보이는 모
든 segment를 수신하면 RST를 전송
– 현재 상황에 대해 명확한 판단이 어려운 경우에는 RST를 전송하지
않음
 States for Reset
1.
Connection이 열려 있지 않은 상태 (CLOSED)에서는 reset이 아닌
모든 수신 segment에 대해 reset을 전송
 특히, 존재하지 않는 connection을 향한 SYN은 이러한 방법으로 reject
됨
 수신 segment에 ACK field가 있는 경우 reset segment의 seq number는
이 ACK number를 사용
 수신 segment에 ACK field가 없는 경우에는 reset segment의 seq
number는 0, ack number는 수신 seq number + 수신 data 길이로 함
 처리 후에 connection은 여전히 CLOSED 상태를 유지
29
Establishing A Connection
 States for Reset
2.
Connection이 non-synchronized 상태 (LISTEN, SYN-SENT, SYNRECEIVED)에 있을 때

다음과 같은 segment를 수신하는 경우 reset을 전송
•
•



수신 segment의 ack가 아직 보내지 않은 seq number에 대한 것일 때
현재 connection의 security level, 또는 compartment와 일치하지 않는
segment를 수신했을 때
송신한 SYN에 대한 ack가 아직 오지 않았고, 수신 된 segment의 precedence
level이 요청된 precedence level보다 높은 경우
•
•
(TCP user와 system에서 허용 된다면) local precedence level을 높이거나
Reset을 송신
•
•
Precedence level이 일치하는 경우와 똑같이 동작
상대 TCP가 local TCP의 precedence에 맞도록 level을 올리지 못하는 경우 (다음
수신 segment를 보고 판단) connection을 종료
송신한 SYN에 대한 ack가 아직 오지 않았고, 수신 된 segment의 precedence
level이 요청된 precedence level보다 낮은 경우
송신한 SYN에 대한 ack가 도착한 경우(현재 수신 segment가 바로 그 ack인 경
우도 포함)
•
•
수신 segment와 local의 precedence level이 정확히 일치 해야 함
일치하지 않는 경우 reset 전송
 수신 segment에 ACK field가 있는 경우 reset segment의 seq number는 이 ACK
를 사용
 수신 segment에 ACK field가 없는 경우에는 reset segment의 seq number는 0,
ack number는 수신 seq number + 수신 data 길이로 함
 처리 후에 connection은 이전 상태를 유지
30
Establishing A Connection
 States for Reset
3.
Connection이 synchronized 상태 (ESTABLISHED, FIN-WAIT-1,
FIN-WAIT-2, CLOSE-WAIT, CLOSING, LAST-ACK, TIME-WAIT)에
있을 때

올바르지 않은 segment (seq number가 window를 벗어난 경우,
ack number가 틀린 경우)를 수신했을 때
•
•
•

ACK segment를 전송
ACK의 seq number는 현재 seq number, ack number는 수신되기를
기다리고 있는 다음 ack number
Connection은 현재의 상태를 유지
수신 된 segment의 security level, compartment, precedence 중
하나가 요청된 level, compartment, precedence와 일치하지 않는
경우에 reset을 전송
•
•
Connection은 CLOSED 상태로 넘어 감
Reset segment의 seq number는 수신 segment의 ack number를 사
용
31
Establishing A Connection
 Reset Processing
– Reset을 받으면 우선 이 reset이 유효한지를 확인
 SYN-SENT가 아닌 다른 상태에서 RST segment를 수신한 경우
• Reset segment의 seq field가 window 안에 있는지 확인하여 이 reset이
유효한지 검사
 SYN-SENT 상태에서 RST segment를 수신한 경우
• RST가 송신한 SYN에 대한 것인지 ACK field를 통해 확인하여 이 reset
이 유효한지 검사
– 유효한 reset을 수신하면 connection의 상태를 변경
 LISTEN 상태인 경우에는 reset을 무시
 SYN-RECEIVED 상태인 경우
• 이전 상태가 LISTEN이었던 경우 다시 LISTEN 상태로 돌아감
• 그 외의 경우에는 connection을 abort하고 CLOSED 상태로 감
 그 외의 상태인 경우
• Connection을 abort하고 user에게 이를 알림
• CLOSED 상태로 감
32
Closing A Connection
 CLOSE operation
– “더 이상 송신할 data가 없음”을 의미
 TCP를 CLOSE 한 user도 상대방이 CLOSE 될 때까지는 계속 RECEIVE 할
수 있음
– 상대 TCP가 CLOSE 되면 (user가 RECEIVE를 하고 있는 지와 무관하
게) TCP는 user에게 상대 TCP의 CLOSE를 알리고, user는 connection
을 적절하게 종료할 수 있음
– TCP는 connection이 CLOSE 되기 전에 user로부터 전송 요청 된 모
든 data를 상대방에 전달 완료하는 것을 보장
 Close Case 1: Local user initiates the close
– TCP는 FIN segment를 만들어 전송 queue에 넣음
 이후로 user가 보내는 SEND는 받아들여지지 않음 (RECEIVE는 허용)
 TCP는 FIN-WAIT-1 상태가 됨
– FIN보다 먼저 전송된 segment들과 FIN segment는 ack를 받을 때까
지 재전송 됨
– Remote TCP가 local TCP의 FIN에 대한 ack와 remote의 FIN을 보내
오면 local TCP는 remote에게 FIN에 대한 ack를 보낼 수 있음
 FIN을 받은 TCP는 즉시 이에 대해 ack를 보내지만, 자신의 FIN은 user가
CLOSE 할 때까지 보내지 않음
33
Closing A Connection
 Close Case 2: TCP receives a FIN from the network
– TCP가 (먼저 요청하지 않은) FIN을 받으면 ack를 보내고 user에
게 이 사실을 알림
– CLOSE 사실을 통보 받은 user가 TCP에게 CLOSE를 요청하면 TCP
는 전송 queue에 있는 모든 data를 전송하고 FIN을 보냄
– FIN을 보낸 TCP는 그에 대한 ack를 기다리고, 이를 수신하면
connection을 종료
– User timeout이 지나도 ack가 오지 않으면 connection은 abort
되고 user에게 이를 알림
 Close Case 3: Both users close simultaneously
– Connection의 양쪽 user가 동시에 CLOSE를 요청하면 FIN
segment들도 동시에 주고받게 됨
– FIN보다 먼저 전송된 segment들이 모두 처리 되고 ack가 도착했
다면 각 TCP는 수신한 FIN에 대해 ack를 전송
– 양쪽이 모두 ack를 전송하면 connection이 종료 됨
34
Closing A Connection
TCP A
TCP B
ESTABLISHED
(Close)
FIN-WAIT-1
ESTABLISHED
CLOSE-WAIT
FIN-WAIT-2
(Close)
LAST-ACK
TIME-WAIT
(2 MSL)
CLOSED
CLOSED
Normal Close Sequence
TCP A
TCP B
ESTABLISHED
(Close)
FIN-WAIT-1
ESTABLISHED
(Close)
CLOSING
CLOSING
TIME-WAIT
(2 MSL)
CLOSED
Simultaneous Close Sequence
35
TIME-WAIT
(2 MSL)
CLOSED
Precedence and Security

이 페이지의 내용은 RFC 793에 정의 되어 있으나 이 기능을 실질적으로 담당하는 IP에서 해당 기능을 현재 거의
사용하지 않고 있으므로 현실적으로는 의미 없는 내용임
 Security/Compartment
– Security와 compartment 값이 정확히 일치하는 포트들 사이에서만
connection을 허용
– 두 port들 간에 요청된 level 보다 높은 precedence를 사용
– TCP의 precedence와 security parameter들은 IP의 그것을 그대로 사용
 TCP spec. (RFC 793)의 “security/compartment”라는 단어는 IP에서 사용되는
security parameter들을 나타냄 (security, compartment, user group, handling
restriction 등)
 Rejecting a connection
– Security/compartment 값이 맞지 않거나 precedence 값이 낮은 연결 요청
은 모두 reset을 보냄으로써 거부
– 너무 낮은 precedence로 인한 연결 거부는 SYN에 대한 ack가 도착한 뒤에
만 이루어질 수 있음
 Sending security parameters
– Non-secure network에서도 security parameter가 전송 될 수 있음
 그러므로 non-secure network에 있는 host라도 security parameter를 수신할 수
있어야 함
 Security parameter의 송신을 반드시 해야 할 필요는 없음
36
Data Communication
 Data Transmission
– 재전송과 중복 제거
 Error (checksum error), network congestion 등의 이유로 segment가 유실 될 수
있음
• 모든 segment가 확실히 전달 됨을 보장하기 위해 TCP는 유실 된 segment에 대한
재전송 기능을 가지고 있음
 Network 상의 문제나 재전송에 의해서 중복된 segment가 수신 될 수 있음
• Seq number와 ack number를 이용한 segment가 유효한 것인지를 판단
– 관련된 변수
 SND.NXT (sender): 다음 전송할 sequence number
• Sender가 새로운 segment를 만들어 전송하면 이 값이 증가
 RCV.NXT (receiver): 다음 수신 되어야 할 sequence number
• Receiver가 수신된 segment를 받아들이면 이 값이 증가하고 ack를 전송
 SND.UNA (sender): 아직 ack를 받지 못한 가장 오래 된 sequence number
• Sender가 ack를 수신하면 이 값이 증가
 전송된 모든 data에 대한 ack가 전달 되고 data flow가 순간적으로 멈췄을 때, 위
의 세 변수 값이 모두 같음
 Communication의 지연에 따라 이 값들이 서로 달라질 수 있음
 이 값들이 증가하는 크기는 segment의 data length와 같음
– ESTABLISHED 상태가 된 다음부터는 모든 segment들이 ack 정보를 가지고
있어야 함
– User가 CLOSE를 요청하거나, 상대 TCP로부터 FIN segment를 수신하는 것
은 push function의 호출을 의미
37
Data Communication
 Retransmission Timeout
– Retransmission timeout의 결정
 Internetwork을 이루는 network의 종류가 다양하며, TCP가 활용되는 영역도 매우
넓으므로 이를 고려하여 동적으로 결정
 The Communication of Urgent Information
– TCP urgent mechanism의 목적
 송신 user가 수신 user에게 일반 data와 다른 urgent data를 전달 할 수 있게 함
 모든 urgent data가 수신 user에게 전달 되면 수신 TCP가 이를 수신 user에게 알
릴 수 있게 함
– “End of urgent information” pointer
 수신 TCP는 이 pointer가 receive seq number (RCV.NXT)보다 뒤에 있는 것을 확인
하면 user가 “urgent mode”로 들어가도록 통보
 수신 seq number가 이 pointer에 다다르면 수신 TCP는 user에게 “normal mode”
로 돌아오도록 알림
 User가 “urgent mode”에 있는 동안 이 pointer가 update 되어도 user에게는 이 사
실을 알릴 필요 없음
– Urgent field
 TCP header의 URG control flag이 켜져 있으면 segment seq number와 urgent
field의 값을 더해 urgent pointer의 값을 계산
 URG flag이 켜져 있지 않으면 urgent data가 없음을 나타냄
– Push function과 함께 사용되면 urgent data를 더욱 정확히 전달할 수 있음
38
Data Communication
 Managing the Window
– Window field
Data 수신자가 현재 받아들일 수 있는 seq number의 범위를 알림
이 값은 connection에서 사용하는 buffer의 size와 연관된 것으로 봄
받아들일 수 없는 크기의 data를 수신하면 이를 버림
Window size가 크면 전송이 원활해 지나, 재전송이 발생하는 경우에network과
TCP에 과도한 부하가 걸림
 Window size가 작으면 전송 효율이 낮아짐




– “Shrinking the window”
 TCP는 큰 window size를 상대에게 알린 뒤에 다시 보다 작은 window를 알릴 수
있으나, 이는 좋지 않은 동작임
 Robustness principle은 TCP가 스스로 window size를 줄이지 않도록 하고 있음
• 상대 TCP가 window size를 줄이는 데 대해서는 올바르게 반응할 수 있어야 함
– Zero size window
 송신 TCP는 send window size가 0이더라도 최소 1 octet의 새로운 data를 user로
부터 받아 송신할 수 있어야 함
 Window size가 0이더라도 재전송은 정상적으로 이루어져야 함
• 이 경우에 재전송 간격을 2분으로 하는 것을 권장
• 0 size window가 다시 열리는 것을 감지하기 위해 이러한 재전송은 반드시 필요
 수신 TCP는 window size가 0일 때 도착하는 segment에 대해 다음 수신 seq
number와 window size (0)을 포함한 ack를 송신 해야 함
39
Data Communication
 Managing the Window
– Data packaging
 송신 TCP는 전송 할 data를 window size에 맞춰 segment로
packaging 함
 Retransmission queue에서 segment들을 다시 packaging 할 수 있
음
• 반드시 필요하지는 않으나 유용할 수 있음
– Identical sequence numbers
 한쪽 방향으로만 data 전송이 이루어지고 있는 connection에서는
모든 ack segment가 같은 seq number를 가짐
• Network 상에서 이 ack들의 순서가 뒤바뀌는 경우, 거기에 포함 된
window size 중 어느 것이 최근의 값인지 판단할 수 없음
• 심각한 문제는 아니나 오래 된 window size를 사용하여 data 전송이 이
루어질 수 있음
 Ack number가 가장 큰 segment를 최근의 것으로 판단하여 사용함
으로써 이 문제를 피할 수 있음
40
References
 RFC 793: TRANSMISSION CONTROL PROTOCOL
– IETF
– Sep. 1981
 TCP/IP 완벽 가이드 (일부)
– Charles M. Kozierok
– 에이콘 출판 (국내 번역판)
– 2006년 1월
41