TCP连接的建立与终止

图示

在这里插入图片描述    为了建立一个TCP连接,需要完成以下步骤:
    1.主动开启者(通常称为客户端)发送一个SYN报文段,并指明自己想要连接的端口号和它的客户端初始序列号。通常,客户端还会借此发送一个或多个选项。
    2.服务器也发送自己的SYN报文段作为响应,并包含了它的初始序列号。此外,为了确认客户端的SYN,服务器将其包含的客户端序列号数值加1后作为返回的ACK数值。因此,每发送一个SYN,序列号就会自动加1。这样如果出现丢失的情况,该SYN段将会重传。
    3.为了确认服务器的SYN,客户端将服务器序列号数值加1后作为返回的ACK数值。


    TCP协议规定通过发送一个FIN段来发起关闭操作。只有当连接双方都完成关闭操作后,才构成一个完整关闭:
    1.连接的主动关闭者发送一个FIN段指明接收者希望看到的自己当前的序列号。FIN段还包含了一个ACK段用于确认对方最近一次发来的数据。
    2.连接的被动关闭者将接收的序列号数值加1作为响应的ACK值,以表明它已经成功接收到主动关闭者发送的FIN。此时,上层的应用程序会被告知连接的另一端已经提出了关闭的请求。通常,这将导致应用程序发起自己的关闭操作。接着,被动关闭者将身份转变为主动关闭者,并发送自己的FIN。
    3.为了完成连接的关闭,最后发送的报文段包含一个ACK用于确认上一个FIN。

实验

    服务器端开启了FTP服务,服务端口号21,IP地址为192.168.182.132。
    在客户端执行以下命令:

telnet 192.168.182.132 21

连接成功后输入quit断开连接。

Wireshark抓包

在这里插入图片描述

三次握手

第一次握手:
Transmission Control Protocol, Src Port: 33022, Dst Port: 21, Seq: 0, Len: 0
Source Port: 33022
Destination Port: 21
[Stream index: 19]
[TCP Segment Len: 0]
Sequence number: 0 (relative sequence number)
[Next sequence number: 0 (relative sequence number)]
Acknowledgment number: 0
1010 … = Header Length: 40 bytes (10)
Flags: 0x002 (SYN)
000. … … = Reserved: Not set
…0 … … = Nonce: Not set
… 0… … = Congestion Window Reduced (CWR): Not set
… .0… … = ECN-Echo: Not set
… …0. … = Urgent: Not set
… …0 … = Acknowledgment: Not set
… … 0… = Push: Not set
… … .0… = Reset: Not set
… … …1. = Syn: Set
… … …0 = Fin: Not set
[TCP Flags: ··········S·]
Window size value: 29200
[Calculated window size: 29200]
Checksum: 0x80d8 [unverified]
[Checksum Status: Unverified]
Urgent pointer: 0
Options: (20 bytes), Maximum segment size, SACK permitted, Timestamps, No-Operation (NOP), Window scale
[Timestamps]

    第一次握手客户端的初始序列号为0,标志字段(Flags)的SYN位置位。


第二次握手:
Transmission Control Protocol, Src Port: 21, Dst Port: 33022, Seq: 0, Ack: 1, Len: 0
Source Port: 21
Destination Port: 33022
[Stream index: 19]
[TCP Segment Len: 0]
Sequence number: 0 (relative sequence number)
[Next sequence number: 0 (relative sequence number)]
Acknowledgment number: 1 (relative ack number)
1000 … = Header Length: 32 bytes (8)
Flags: 0x012 (SYN, ACK)
000. … … = Reserved: Not set
…0 … … = Nonce: Not set
… 0… … = Congestion Window Reduced (CWR): Not set
… .0… … = ECN-Echo: Not set
… …0. … = Urgent: Not set
… …1 … = Acknowledgment: Set
… … 0… = Push: Not set
… … .0… = Reset: Not set
… … …1. = Syn: Set
… … …0 = Fin: Not set
[TCP Flags: ·······A··S·]
Window size value: 65535
[Calculated window size: 65535]
Checksum: 0xee81 [unverified]
[Checksum Status: Unverified]
Urgent pointer: 0
Options: (12 bytes), Maximum segment size, No-Operation (NOP), Window scale, No-Operation (NOP), No-Operation (NOP), SACK permitted
[SEQ/ACK analysis]
[Timestamps]

    第二次握手服务器的初始序列号为0,标志字段(Flags)的SYN位和ACK位置位。ACK号等于客户端的序列号加1=0+1=1。


第三次握手:
Transmission Control Protocol, Src Port: 33022, Dst Port: 21, Seq: 1, Ack: 1, Len: 0
Source Port: 33022
Destination Port: 21
[Stream index: 19]
[TCP Segment Len: 0]
Sequence number: 1 (relative sequence number)
[Next sequence number: 1 (relative sequence number)]
Acknowledgment number: 1 (relative ack number)
0101 … = Header Length: 20 bytes (5)
Flags: 0x010 (ACK)
000. … … = Reserved: Not set
…0 … … = Nonce: Not set
… 0… … = Congestion Window Reduced (CWR): Not set
… .0… … = ECN-Echo: Not set
… …0. … = Urgent: Not set
… …1 … = Acknowledgment: Set
… … 0… = Push: Not set
… … .0… = Reset: Not set
… … …0. = Syn: Not set
… … …0 = Fin: Not set
[TCP Flags: ·······A····]
Window size value: 229
[Calculated window size: 29312]
[Window size scaling factor: 128]
Checksum: 0x7430 [unverified]
[Checksum Status: Unverified]
Urgent pointer: 0
[SEQ/ACK analysis]
[Timestamps]

    第三次握手,客户端为了确认服务器的SYN,标志字段(Flags)的ACK位置位,将服务器的序列号+1=0+1=1,作为自己的ACK号。同时自己的序列号+1=0+1=1。

四次断开

第一次断开:
Transmission Control Protocol, Src Port: 21, Dst Port: 33022, Seq: 71, Ack: 18, Len: 0
Source Port: 21
Destination Port: 33022
[Stream index: 19]
[TCP Segment Len: 0]
Sequence number: 71 (relative sequence number)
[Next sequence number: 71 (relative sequence number)]
Acknowledgment number: 18 (relative ack number)
0101 … = Header Length: 20 bytes (5)
Flags: 0x011 (FIN, ACK)
000. … … = Reserved: Not set
…0 … … = Nonce: Not set
… 0… … = Congestion Window Reduced (CWR): Not set
… .0… … = ECN-Echo: Not set
… …0. … = Urgent: Not set
… …1 … = Acknowledgment: Set
… … 0… = Push: Not set
… … .0… = Reset: Not set
… … …0. = Syn: Not set
… … …1 = Fin: Set
[TCP Flags: ·······A···F]
Window size value: 8212
[Calculated window size: 2102272]
[Window size scaling factor: 256]
Checksum: 0xee75 [unverified]
[Checksum Status: Unverified]
Urgent pointer: 0
[Timestamps]

    本例客户端为主动关闭者,标志字段(Flags)的FIN位置位。当前序列号为71;ACK号为18,用于确认服务器端最近发来的数据。


第二次断开:
Transmission Control Protocol, Src Port: 33022, Dst Port: 21, Seq: 18, Ack: 71, Len: 0
Source Port: 33022
Destination Port: 21
[Stream index: 19]
[TCP Segment Len: 0]
Sequence number: 18 (relative sequence number)
[Next sequence number: 18 (relative sequence number)]
Acknowledgment number: 71 (relative ack number)
0101 … = Header Length: 20 bytes (5)
Flags: 0x010 (ACK)
000. … … = Reserved: Not set
…0 … … = Nonce: Not set
… 0… … = Congestion Window Reduced (CWR): Not set
… .0… … = ECN-Echo: Not set
… …0. … = Urgent: Not set
… …1 … = Acknowledgment: Set
… … 0… = Push: Not set
… … .0… = Reset: Not set
… … …0. = Syn: Not set
… … …0 = Fin: Not set
[TCP Flags: ·······A····]
Window size value: 229
[Calculated window size: 29312]
[Window size scaling factor: 128]
Checksum: 0x73d9 [unverified]
[Checksum Status: Unverified]
Urgent pointer: 0
[SEQ/ACK analysis]
[Timestamps]

    第二次断开,服务器应答确认收到客户端的FIN。本例中情形与图中不一样,ACK号没有加1。


第三次断开:
Transmission Control Protocol, Src Port: 33022, Dst Port: 21, Seq: 18, Ack: 72, Len: 0
Source Port: 33022
Destination Port: 21
[Stream index: 19]
[TCP Segment Len: 0]
Sequence number: 18 (relative sequence number)
[Next sequence number: 18 (relative sequence number)]
Acknowledgment number: 72 (relative ack number)
0101 … = Header Length: 20 bytes (5)
Flags: 0x011 (FIN, ACK)
000. … … = Reserved: Not set
…0 … … = Nonce: Not set
… 0… … = Congestion Window Reduced (CWR): Not set
… .0… … = ECN-Echo: Not set
… …0. … = Urgent: Not set
… …1 … = Acknowledgment: Set
… … 0… = Push: Not set
… … .0… = Reset: Not set
… … …0. = Syn: Not set
… … …1 = Fin: Set
[TCP Flags: ·······A···F]
Window size value: 229
[Calculated window size: 29312]
[Window size scaling factor: 128]
Checksum: 0x73d7 [unverified]
[Checksum Status: Unverified]
Urgent pointer: 0
[SEQ/ACK analysis]
[Timestamps]

    第三次断开,服务器变被动关闭者为主动关闭者,向客户端发送FIN。


第四次断开:
Transmission Control Protocol, Src Port: 21, Dst Port: 33022, Seq: 72, Ack: 19, Len: 0
Source Port: 21
Destination Port: 33022
[Stream index: 19]
[TCP Segment Len: 0]
Sequence number: 72 (relative sequence number)
[Next sequence number: 72 (relative sequence number)]
Acknowledgment number: 19 (relative ack number)
0101 … = Header Length: 20 bytes (5)
Flags: 0x010 (ACK)
000. … … = Reserved: Not set
…0 … … = Nonce: Not set
… 0… … = Congestion Window Reduced (CWR): Not set
… .0… … = ECN-Echo: Not set
… …0. … = Urgent: Not set
… …1 … = Acknowledgment: Set
… … 0… = Push: Not set
… … .0… = Reset: Not set
… … …0. = Syn: Not set
… … …0 = Fin: Not set
[TCP Flags: ·······A····]
Window size value: 8212
[Calculated window size: 2102272]
[Window size scaling factor: 256]
Checksum: 0xee75 [unverified]
[Checksum Status: Unverified]
Urgent pointer: 0
[SEQ/ACK analysis]
[Timestamps]

    第四次断开,客户端确认服务器的FIN。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值