Download presentation
Presentation is loading. Please wait.
1
TRANSMISSION CONTROL PROTOCOL (TCP)
본 자료는 TCP의 역할과 동작에 관한 개요를 살펴보기 위한 목적으로 작성 되었으며, TCP를 정의하고 있는 RFC793 중 다음 내용은 본 자료에서 제외 되었음 ‘2. PHILOSOPHY’: TCP 동작의 기본 철학이며 이를 구체화한 내용은 이 자료에서 cover하고 있음 ‘3.8 Interfaces’: TCP와 다른 layer 사이의 interface를 정의 ‘3.9 Event Processing’: TCP와 state와 event에 따른 처리를 구체적으로 정의
2
Contents Introductions Header Format Terminology
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
3
Contents Sequence Numbers Establishing A Connection
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 Establishing A Connection 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
4
Contents Closing A Connection Precedence and Security
Close operation Close case 1: Local user initiates the close Close case 2: TCP receives a FIN from the network Close 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
5
Introduction Motivation Scope
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
6
Introduction Operation Basic Data Transfer Reliability Flow Control
일정 수의 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도 사용하지 않음
7
Header Format TCP protocol header TCP segment는 internet datagram으로 전송
IP header는 source, destination 주소를 비롯한 여러 가지 정보를 포함 IP header 뒤에 TCP에 관련된 정보를 가진 header를 붙임
8
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의 배수
9
Header Format Header Fields Reserved (6 bits) Control Bits (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으로 채우고 계산
10
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가 켜진 경우에만 사용
11
Header Format Header Fields Options (variable) Padding (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을 채움
12
Terminology Transmission Control Block (TCB) Send Sequence Variables
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
13
Terminology Receive Sequence Variables Current Segment 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
14
Terminology Connection States LISTEN SYN-SENT SYN-RECEIVED ESTABLISHED
다른 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로부터 연결 종료 요청이 오기를 기다리고 있는 상태
15
Terminology Connection States Events CLOSING LAST-ACK TIME-WAIT CLOSED
상대 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
16
TCP Connection State Diagram
각 화살표의 설명은 ‘Event/Action’을 나타내며 Action 없이 state만 바뀌는 경우도 있음 초기 CLOSED 상태에서 들어오는 Active open event는 client로써 연결을 요청하는 경우, Passive open event는 server로써 연결을 기다리는 경우를 나타냄
17
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인 경우에는 이에 대한 고려가 추가로 필요
18
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 시간보다 짧음
19
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를 받아야 함 A --> B SYN my sequence number is X A <-- B ACK your sequence number is X A <-- B SYN my sequence number is Y A --> B ACK 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이 필요
20
Sequence Numbers Knowing When to Keep Quiet The TCP Quiet Time Concept
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로 간주 되어 버려질 수 있는 위험은 감수해야 함
21
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분이며, 이는 약간 짧을 수도 있으나 여전히 쓸만함
22
Establishing A Connection
TCP A TCP B SEQ=100 CTL=SYN SEQ=300 ACK=101 CTL=SYN,ACK SEQ=101 ACK=301 CTL=ACK SEQ=101 ACK=301 CTL=ACK DATA CLOSED LISTEN SYN-SENT SYN-RECEIVED 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가 같음
23
Establishing A Connection
TCP A TCP B CLOSED CLOSED SEQ=300 CTL=SYN SYN-SENT SYN-SENT SEQ=100 CTL=SYN SYN-RECEIVED SEQ=100 ACK=301 CTL=SYN,ACK SYN-RECEIVED SEQ=300 ACK=101 CTL=SYN,ACK ESTABLISHED SEQ=101 ACK=301 CTL=ACK ESTABLISHED Simultaneous Connection Synchronization 양 TCP 모두 CLOSED SYN-SENT SYN-RECEIVED ESTABLISHED의 순서를 거침 SYN-SENT 상태에서 상대의 SYN을 받으면 이에 대한 ack를 전송하고 SYN-RECEIVED 상태에서 자신의 SYN에 대한 ack를 계속 기다림 RFC 793에서는 위와 같이 정리하고 있으나, 최초 양쪽에서 SYN을 주고 받은 다음 단순히 각각 ack만 보냄으로써 위의 절차보다 간단하게 연결이 성립되는 case를 보여주고 있는 자료도 찾을 수 있음
24
Establishing A Connection
TCP A TCP B CLOSED LISTEN SEQ=90 CTL=SYN SEQ=100 CTL=SYN SYN-SENT SYN-RECEIVED SEQ=300 ACK=91 CTL=SYN,ACK SEQ=91 CTL=RST LISTEN SYN-RECEIVED SEQ=400 ACK=101 CTL=SYN,ACK ESTABLISHED SEQ=101 ACK=401 CTL=ACK 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를 전송하면서 좀 더 복잡한 과정이 진행
25
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 전송을 계속하려고 함
26
Establishing A Connection
TCP A TCP B SEQ=400 CTL=SYN SEQ=300 ACK=100 CTL=ACK SEQ=100 CTL=RST (CRASH) (send 300, receive 100) CLOSED SYN-RECEIVED ESTABLISHED (??) (!!) SYN-SENT (abort!!) 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 과정을 따름
27
Establishing A Connection
TCP A TCP B (CRASH) (send 300, receive 100) ESTABLISHED SEQ=300 ACK=100 DATA=10 CTL=ACK (??) SEQ=100 CTL=RST (abort!!) Active Side Causes Half-Open Connection Discovery TCP A가 crash 된 후에 이를 모르는 TCP B가 data를 전송 TCP A에게는 해당 connection이 존재하지 않으므로 RST 전송 RST를 받은 TCP B는 connection abort
28
Establishing A Connection
TCP A TCP B LISTEN SEQ=Z CTL=SYN LISTEN SEQ=X ACK=Z+1 CTL=SYN,ACK SYN-RECEIVED (??) SEQ=Z+1 CTL=RST (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 상태로 돌아감
29
Establishing A Connection
Reset Generation 다양한 예외 상황 발생이 가능하며 이는 정해진 RST generation and processing 규칙에 따라 처리 됨 일반적으로 현재 connection과 분명 관계가 없는 것으로 보이는 모든 segment를 수신하면 RST를 전송 현재 상황에 대해 명확한 판단이 어려운 경우에는 RST를 전송하지 않음 States for Reset 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 상태를 유지
30
Establishing A Connection
States for Reset Connection이 non-synchronized 상태 (LISTEN, SYN-SENT, SYN-RECEIVED)에 있을 때 다음과 같은 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을 송신 송신한 SYN에 대한 ack가 아직 오지 않았고, 수신 된 segment의 precedence level이 요청된 precedence level보다 낮은 경우 Precedence level이 일치하는 경우와 똑같이 동작 상대 TCP가 local TCP의 precedence에 맞도록 level을 올리지 못하는 경우 (다음 수신 segment를 보고 판단) connection을 종료 송신한 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은 이전 상태를 유지
31
Establishing A Connection
States for Reset 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를 사용
32
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 상태로 감
33
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 할 때까지 보내지 않음
34
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이 종료 됨
35
Closing A Connection TCP A TCP B ESTABLISHED FIN-WAIT-1 CLOSE-WAIT
SEQ=100 ACK=300 CTL=FIN,ACK SEQ=300 ACK=101 CTL=ACK SEQ=300 ACK=101 CTL=FIN,ACK SEQ=101 ACK=301 CTL=ACK ESTABLISHED FIN-WAIT-1 CLOSE-WAIT FIN-WAIT-2 CLOSED Normal Close Sequence (Close) LAST-ACK TIME-WAIT (2 MSL) TCP A TCP B SEQ=100 ACK=300 CTL=FIN,ACK SEQ=300 ACK=100 CTL=FIN,ACK ESTABLISHED (Close) CLOSING (2 MSL) CLOSED TIME-WAIT FIN-WAIT-1 Simultaneous Close Sequence SEQ=101 ACK=301 CTL=ACK SEQ=301 ACK=101 CTL=ACK
36
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의 송신을 반드시 해야 할 필요는 없음
37
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의 호출을 의미
38
Data Communication 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를 더욱 정확히 전달할 수 있음
39
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를 송신 해야 함
40
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를 최근의 것으로 판단하여 사용함으로써 이 문제를 피할 수 있음
41
References RFC 793: TRANSMISSION CONTROL PROTOCOL TCP/IP 완벽 가이드 (일부)
IETF Sep. 1981 TCP/IP 완벽 가이드 (일부) Charles M. Kozierok 에이콘 출판 (국내 번역판) 2006년 1월
Similar presentations