TCP/IP를 통한 3방향 핸드셰이크에 대한 설명

이 문서에서는 TCP 연결을 시작하거나 종료할 때 클라이언트와 서버 간의 TCP(Transmission Control Protocol) 3방향 핸드셰이크 프로세스에 대해 설명합니다.

적용 대상: Windows Server 2012 R2
원본 KB 번호: 172983

요약

이 문서는 TCP/IP(Transmission Control Protocol/Internet Protocol)에 익숙한 대상을 대상으로 합니다. TCP 연결을 시작하거나 종료할 때 클라이언트와 서버 간의 TCP 3방향 핸드셰이크 프로세스에 대해 설명합니다.

추가 정보

TCP/IP 전송 프로토콜의 TCP 수준은 연결 지향입니다. 연결 지향은 데이터를 전송하기 전에 신뢰할 수 있는 연결을 가져오고 승인해야 한다는 것을 의미합니다. TCP 수준 데이터 전송, 연결 설정 및 연결 종료는 전체 프로세스를 제어하는 특정 제어 매개 변수를 유지 관리합니다. 컨트롤 비트는 다음과 같이 나열됩니다.

URG: 긴급 포인터 필드 중요
ACK: 승인 필드 중요
PSH: Push 함수
RST: 연결 다시 설정
SYN: 시퀀스 번호 동기화
FIN: 보낸 사람으로부터 더 이상 데이터가 없습니다.

3방향 핸드셰이크가 수행되는 두 가지 시나리오가 있습니다.

  • 연결 설정(활성 열기)

  • 연결 종료(활성 닫기)

네트워크 모니터 캡처에서 다음 샘플 정보를 얻었습니다. 네트워크 모니터는 Microsoft Systems Management Server에서 가져올 수 있는 프로토콜 분석기입니다.

연결 설정

다음 시퀀스는 TCP 연결이 설정되는 프로세스를 보여줍니다.

프레임 1:

첫 번째 프레임에서 볼 수 있듯이 클라이언트 NTW3은 SYN 세그먼트(TCP ....S.)를 보냅니다. 시퀀스 번호를 동기화하는 것은 서버에 대한 요청입니다. 초기 시퀀스 번호(ISN)를 지정합니다. ISN는 1씩 증가하며(8221821+1=8221822) 서버로 전송됩니다. 연결을 시작하려면 클라이언트와 서버가 서로의 시퀀스 번호를 동기화해야 합니다. 길이(len: 4)로 정의된 MSS(최대 세그먼트 크기)를 설정할 수도 있습니다. 이 옵션은 보낸 사람에게 수신하려는 MSS를 전달합니다. 승인 필드(ack: 0)는 3방향 핸드셰이크의 첫 번째 부분이기 때문에 0으로 설정됩니다.


1 2.0785 NTW3 --> BDC3 TCP ....S., len: 4, seq: 8221822-8221825, ack: 0,
win: 8192, src: 1037 dst: 139 (NBT Session) NTW3 --> BDC3 IP

TCP: ....S., len: 4, seq: 8221822-8221825, ack: 0, win: 8192, src: 1037
dst: 139 (NBT Session)

TCP: Source Port = 0x040D
 TCP: Destination Port = NETBIOS Session Service
 TCP: Sequence Number = 8221822 (0x7D747E)
 TCP: Acknowledgement Number = 0 (0x0)
 TCP: Data Offset = 24 (0x18)
 TCP: Reserved = 0 (0x0000)
 TCP: Flags = 0x02 : ....S.

TCP: ..0..... = No urgent data
 TCP: ...0.... = Acknowledgement field not significant
 TCP: ....0... = No Push function
 TCP: .....0.. = No Reset
 TCP: ......1. = Synchronize sequence numbers
 TCP: .......0 = No Fin

TCP: Window = 8192 (0x2000)
 TCP: Checksum = 0xF213
 TCP: Urgent Pointer = 0 (0x0)
 TCP: Options

TCP: Option Kind (Maximum Segment Size) = 2 (0x2)
 TCP: Option Length = 4 (0x4)
 TCP: Option Value = 1460 (0x5B4)

TCP: Frame Padding

00000: 02 60 8C 9E 18 8B 02 60 8C 3B 85 C1 08 00 45 00 .`.....`.;....E.
00010: 00 2C 0D 01 40 00 80 06 E1 4B 83 6B 02 D6 83 6B .,..@....K.k...k
00020: 02 D3 04 0D 00 8B 00 7D 74 7E 00 00 00 00 60 02 .......}t~....`.
00030: 20 00 F2 13 00 00 02 04 05 B4 20 20 .........

프레임 2:

두 번째 프레임에서 볼 수 있듯이 서버 BDC3은 ACK 및 SYN 세그먼트(TCP .A..S.)를 보냅니다. 이 세그먼트에서 서버는 동기화를 위해 클라이언트의 요청을 승인합니다. 한편 서버는 시퀀스 번호의 동기화를 위해 클라이언트에 요청을 보냅니다. 이 세그먼트에는 한 가지 주요 차이점이 있습니다. 서버는 승인 번호(8221823)를 클라이언트로 전송합니다. 승인은 ACK가 클라이언트가 시작한 SYN과 관련이 있음을 클라이언트에 대한 증거일 뿐입니다. 클라이언트의 요청을 승인하는 프로세스를 통해 서버는 클라이언트의 시퀀스 번호를 하나씩 증가시키고 이를 승인 번호로 사용할 수 있습니다.


2 2.0786 BDC3 --> NTW3 TCP .A..S., len: 4, seq: 1109645-1109648, ack:
8221823, win: 8760, src: 139 (NBT Session) dst: 1037 BDC3 --> NTW3 IP

TCP: .A..S., len: 4, seq: 1109645-1109648, ack: 8221823, win: 8760,
src: 139 (NBT Session) dst: 1037

TCP: Source Port = NETBIOS Session Service
 TCP: Destination Port = 0x040D
 TCP: Sequence Number = 1109645 (0x10EE8D)
 TCP: Acknowledgement Number = 8221823 (0x7D747F)
 TCP: Data Offset = 24 (0x18)
 TCP: Reserved = 0 (0x0000)
 TCP: Flags = 0x12 : .A..S.

TCP: ..0..... = No urgent data
 TCP: ...1.... = Acknowledgement field significant
 TCP: ....0... = No Push function
 TCP: .....0.. = No Reset
 TCP: ......1. = Synchronize sequence numbers
 TCP: .......0 = No Fin

TCP: Window = 8760 (0x2238)
 TCP: Checksum = 0x012D
 TCP: Urgent Pointer = 0 (0x0)
 TCP: Options

TCP: Option Kind (Maximum Segment Size) = 2 (0x2)
 TCP: Option Length = 4 (0x4)
 TCP: Option Value = 1460 (0x5B4)

TCP: Frame Padding

00000: 02 60 8C 3B 85 C1 02 60 8C 9E 18 8B 08 00 45 00 .`.;...`......E.
00010: 00 2C 5B 00 40 00 80 06 93 4C 83 6B 02 D3 83 6B .,[.@....L.k...k
00020: 02 D6 00 8B 04 0D 00 10 EE 8D 00 7D 74 7F 60 12 ...........}t`.
00030: 22 38 01 2D 00 00 02 04 05 B4 20 20 "8.-......

프레임 3:

세 번째 프레임에서 볼 수 있듯이 클라이언트는 ACK 세그먼트(TCP .A....)를 보냅니다. 이 세그먼트에서 클라이언트는 동기화를 위해 서버의 요청을 승인합니다. 클라이언트는 승인 번호를 제공하는 데 서버가 구현한 것과 동일한 알고리즘을 사용합니다. 클라이언트가 서버의 동기화 요청을 승인하면 신뢰할 수 있는 연결 및 3방향 핸드셰이크를 설정하는 프로세스가 완료됩니다.


3 2.787 NTW3 --> BDC3 TCP .A...., len: 0, seq: 8221823-8221823, ack:
1109646, win: 8760, src: 1037 dst: 139 (NBT Session) NTW3 --> BDC3 IP

TCP: .A...., len: 0, seq: 8221823-8221823, ack: 1109646, win: 8760,
src: 1037 dst: 139 (NBT Session)

TCP: Source Port = 0x040D
 TCP: Destination Port = NETBIOS Session Service
 TCP: Sequence Number = 8221823 (0x7D747F)
 TCP: Acknowledgement Number = 1109646 (0x10EE8E)
 TCP: Data Offset = 20 (0x14)
 TCP: Reserved = 0 (0x0000)
 TCP: Flags = 0x10 : .A....

TCP: ..0..... = No urgent data
 TCP: ...1.... = Acknowledgement field significant
 TCP: ....0... = No Push function
 TCP: .....0.. = No Reset
 TCP: ......0. = No Synchronize
 TCP: .......0 = No Fin

TCP: Window = 8760 (0x2238)
 TCP: Checksum = 0x18EA
 TCP: Urgent Pointer = 0 (0x0)
 TCP: Frame Padding

00000: 02 60 8C 9E 18 8B 02 60 8C 3B 85 C1 08 00 45 00 .`.....`.;....E.
00010: 00 28 0E 01 40 00 80 06 E0 4F 83 6B 02 D6 83 6B .(..@....O.k...k
00020: 02 D3 04 0D 00 8B 00 7D 74 7F 00 10 EE 8E 50 10 .......}t....P.
00030: 22 38 18 EA 00 00 20 20 20 20 20 20 "8....

연결 종료

3방향 핸드셰이크는 네트워크 미디어를 통해 3개의 패킷만 전송해야 하지만 이 신뢰할 수 있는 연결의 종료는 4개의 패킷을 전송해야 합니다. TCP 연결은 전체 이중이므로(데이터는 서로 독립적으로 각 방향으로 흐를 수 있음) 각 방향은 독립적으로 종료되어야 합니다.

프레임 4:

이 프레임 세션에서는 클라이언트가 ACK(TCP .A...F)와 함께 제공되는 FIN을 보내는 것을 볼 수 있습니다. 이 세그먼트에는 두 가지 기본 함수가 있습니다. 먼저 FIN 매개 변수가 설정되면 보낼 데이터가 더 이상 없다는 것을 서버에 알릴 것입니다. 둘째, ACK는 설정한 특정 연결을 식별하는 데 필수적입니다.


4 16.0279 NTW3 --> BDC3 TCP .A...F, len: 0, seq: 8221823-8221823,
ack:3462835714, win: 8760, src: 2337 dst: 139 (NBT Session) NTW3 --> BDC3
IP

TCP: .A...F, len: 0, seq: 8221823-8221823, ack: 1109646, win: 8760, src:
1037 dst: 139 (NBT Session)

TCP: Source Port = 0x040D
 TCP: Destination Port = NETBIOS Session Service
 TCP: Sequence Number = 8221823 (0x7D747F)
 TCP: Acknowledgement Number = 1109646 (0x10EE8E)
 TCP: Data Offset = 20 (0x14)
 TCP: Reserved = 0 (0x0000)
 TCP: Flags = 0x11 : .A...F

TCP: ..0..... = No urgent data
 TCP: ...1.... = Acknowledgement field significant
 TCP: ....0... = No Push function
 TCP: .....0.. = No Reset
 TCP: ......0. = No Synchronize
 TCP: .......1 = No more data from sender

TCP: Window = 8760 (0x2238)
 TCP: Checksum = 0x236C
 TCP: Urgent Pointer = 0 (0x0)

00000: 00 20 AF 47 93 58 00 A0 C9 22 F5 39 08 00 45 00 . .G.X...".9..E.
00010: 00 28 9B F5 40 00 80 06 21 4A C0 5E DE 7B C0 5E .(..@...!J.^.{.^
00020: DE 57 09 21 05 48 0B 20 96 AC CE 66 AE 02 50 11 .W.!.H. ...f..P.
00030: 22 38 23 6C 00 00 "8#l..

프레임 5:

이 프레임에는 클라이언트에서 전송된 FIN을 인정하는 서버 외에는 특별한 항목이 표시되지 않습니다.


5 16.0281 BDC3 --> NTW3 TCP .A...., len: 0, seq: 1109646-1109646,
ack: 8221824, win:28672, src: 139 dst: 2337 (NBT Session) BDC3 --> NTW3
IP

TCP: .A...., len: 0, seq: 1109646-1109646, ack: 8221824, win:28672, src:
139 dst: 2337 (NBT Session)

TCP: Source Port = 0x040D
 TCP: Destination Port = NETBIOS Session Service
 TCP: Sequence Number = 1109646 (0x10EE8E)
 TCP: Acknowledgement Number = 8221824 (0x7D7480)
 TCP: Data Offset = 20 (0x14)
 TCP: Reserved = 0 (0x0000)
 TCP: Flags = 0x10 : .A....

TCP: ..0..... = No urgent data
 TCP: ...1.... = Acknowledgement field significant
 TCP: ....0... = No Push function
 TCP: .....0.. = No Reset
 TCP: ......0. = No Synchronize
 TCP: .......0 = No Fin

TCP: Window = 28672 (0x7000)
 TCP: Checksum = 0xD5A3
 TCP: Urgent Pointer = 0 (0x0)
 TCP: Frame Padding

00000: 00 A0 C9 22 F5 39 08 00 02 03 BA 84 08 00 45 00 ...".9........E.
00010: 00 28 D2 82 00 00 3F 06 6B BD C0 5E DE 57 C0 5E .(....?.k..^.W.^
00020: DE 7B 05 48 09 21 CE 66 AE 02 0B 20 96 AD 50 10 .{.H.!.f... ..P.
00030: 70 00 D5 A3 00 00 90 00 01 00 86 00 p...........

프레임 6:

클라이언트 컴퓨터에서 FIN을 받은 후 서버는 ACK합니다. TCP는 두 컴퓨터 간에 연결을 설정했지만 연결은 여전히 서로 독립적입니다. 따라서 서버는 FIN(TCP .A...F)도 클라이언트로 전송해야 합니다.


6 17.0085 BDC3 --> NTW3 TCP .A...F, len: 0, seq: 1109646-1109646, ack:
8221824, win:28672, src: 139 dst: 2337 (NBT Session) BDC3 --> NTW3 IP

TCP: .A...F, len: 0, seq: 1109646-1109646, ack: 8221824, win:28672, src:
139 dst: 2337 (NBT Session)

TCP: Source Port = 0x0548
 TCP: Destination Port = 0x0921
 TCP: Sequence Number = 1109646 (0x10EE8E)
 TCP: Acknowledgement Number = 8221824 (0x7D7480)
 TCP: Data Offset = 20 (0x14)
 TCP: Reserved = 0 (0x0000)
 TCP: Flags = 0x11 : .A...F

TCP: ..0..... = No urgent data
 TCP: ...1.... = Acknowledgement field significant
 TCP: ....0... = No Push function
 TCP: .....0.. = No Reset
 TCP: ......0. = No Synchronize
 TCP: .......1 = No more data from sender

TCP: Window = 28672 (0x7000)
 TCP: Checksum = 0xD5A2
 TCP: Urgent Pointer = 0 (0x0)
 TCP: Frame Padding

00000: 00 A0 C9 22 F5 39 08 00 02 03 BA 84 08 00 45 00 ...".9........E.
00010: 00 28 D2 94 00 00 3F 06 6B AB C0 5E DE 57 C0 5E .(....?.k..^.W.^
00020: DE 7B 05 48 09 21 CE 66 AE 02 0B 20 96 AD 50 11 .{.H.!.f... ..P.
00030: 70 00 D5 A2 00 00 02 04 05 B4 86 00 p...........

프레임 7:

클라이언트는 서버의 FIN을 ACKing하고 시퀀스 번호를 1씩 증가시켜 서버와 동일한 형식으로 응답합니다.


7 17.0085 NTW3 --> BDC3 TCP .A...., len: 0, seq: 8221824-8221824, ack:
1109647, win: 8760, src: 2337 dst: 139 (NBT Session) NTW3 --> BDC3 IP

TCP: .A...., len: 0, seq: 8221824-8221824, ack: 1109647, win: 8760, src:
2337 dst: 139 (NBT Session)

TCP: Source Port = 0x0921
 TCP: Destination Port = 0x0548
 TCP: Sequence Number = 8221824 (0x7D7480)
 TCP: Acknowledgement Number = 1109647 (0x10EE8F)
 TCP: Data Offset = 20 (0x14)
 TCP: Reserved = 0 (0x0000)
 TCP: Flags = 0x10 : .A....

TCP: ..0..... = No urgent data
 TCP: ...1.... = Acknowledgement field significant
 TCP: ....0... = No Push function
 TCP: .....0.. = No Reset
 TCP: ......0. = No Synchronize
 TCP: .......0 = No Fin

TCP: Window = 8760 (0x2238)
 TCP: Checksum = 0x236B
 TCP: Urgent Pointer = 0 (0x0)

00000: 00 20 AF 47 93 58 00 A0 C9 22 F5 39 08 00 45 00 . .G.X...".9..E.
00010: 00 28 BA F5 40 00 80 06 02 4A C0 5E DE 7B C0 5E .(..@....J.^.{.^
00020: DE 57 09 21 05 48 0B 20 96 AD CE 66 AE 03 50 10 .W.!.H. ...f..P.
00030: 22 38 23 6B 00 00 "8#k..

서버에서 FIN 알림을 ACKing하는 클라이언트는 TCP 연결의 정상 종료를 식별합니다.

참조

RFC 793을 가져옵니다.

RFC는 다음과 같이 인터넷을 통해 얻을 수 있습니다.

모든 RFC의 용지 복사본은 개별적으로 또는 구독 기준으로 NIC에서 사용할 수 있습니다(자세한 내용은 연락처 NIC@NIC.DDN.MIL). 온라인 복사본은 rfc/rfc#.txt 또는 rfc/rfc####.PS(###은 앞에 0이 없는 RFC 번호)으로 NIC.DDN.MIL FTP 또는 Kermit를 통해 사용할 수 있습니다.