目录
-
- 1、传输层协议概述
-
- (1)传输层两个协议的应用场景
- (2)传输层和应用层之间的关系
- (3)传输层的端口
- (4)windows 防火墙的作用
- 2、用户数据协议 UDP
-
- 3、传输控制 TCP 协议概述
-
- (1)TCP报文的首部格式
-
-
-
- 1、分析控制位字段
- 2、分析窗口字段
- 3、抓包分析TCP帧头:
- (2)TCP 协议的主要特点
-
- 4、要关注的3个问题
-
- (1)TCP 如何实现可靠传输
-
- (2)拥塞控制
-
- (3)TCP 的传输连接管理
-
回顾:
网络层:IP协议
- 选择最佳路径的协议:RIP、OSPF、BGP,这些协议统称为 IP 协议
- ICMP:控制报文协议,传递网络是什么故障的协议。网络通不通、主机是否可达、路由是否可用等网络本身的消息
- IGMP:IP组播协议
- ARP/RARP:IP地址和MAC地址之间的转化
传输层:
- TCP协议:建立连接,可靠传输
- UDP协议:不建立连接
应用层:http、https、ftp、DNS、SMTP、RDP、SMTR
探讨什么是服务器,什么是客户端?
- 从本质上来说:都是计算机,都包含计算机的 5 大基本部分。(所以任何一台计算可以充当服务器)
- 只是这两个计算机的应用服务不同:
- 客户端:主要是索取服务,相当于一个客户。(浏览器、迅雷、网易云邮箱、音乐等等)
- 服务器:提供客户对应的服务。(web、邮件、文件下载、远程连接、数据库、等等)
1、传输层协议概述
(1)传输层两个协议的应用场景
TCP:可靠传输
- 编号:会将整个数据包进行分段,并且进行编号,然后按照顺序进行传输。
- 传输过程当中,如果有数据丢失,要求重新传输。
- 流量控制:利用滑动窗口机制,让数据传输端传输的速率不要太快,让数据接收端来得及接收。
- 建立会话:在传输之前,必须建立一个会话,保证通道是通的。就像打电话一样不能直接拨号就说话。(windows 通过 netstat -n,可以查看所有会话)
UDP:不可靠传输
- 不进行编号:一个数据包就能完成数据通信。(所以只有一个数据包时候,建议使用UDP)
- 不建立会话
- 传输效率很高
分析例子:
动作 |
协议 |
分析 |
QQ聊天 |
UDP |
一句话一个数据包就够了,不需要建立会话。 |
QQ传文件 |
TCP |
文件比较大,一个数据包不够, 需要将文件编号,分段一个一个传输 |
QQ聊天、在线视频、网络语音电话 |
UDP |
即时通讯,速度要求高,但是出现偶尔断续不是太大问题,不需要重发机制 |
访问网站 |
TCP |
一个网址里面有很多图片,图片也很大,一个数据包也不够用 |
tftp |
TCP |
下载文件的时候,文件也很大 |
接受邮件、远程登录 |
TCP |
准确高要求高、但是速度可以相对慢 |
(2)传输层和应用层之间的关系
应用层 = 传输层 + 端口号 (端口号就是为了标识这个协议)
应用层 |
传输层 |
http |
TCP + 80端口(说明是访问网址) |
https |
TCP + 443端口 |
ftp |
TCP + 21端口 |
SMTP |
TCP + 25端口 |
POP3 |
TCP + 110 端口 |
RDP (远程桌面) |
TCP + 3389端口 |
共享文件夹 |
TCP + 445端口 |
SQL |
TCP + 1433端口 |
DNS(域名解析) |
UDP + 53端口 or TCP+53端口 |
(3)传输层的端口
应用层协议和服务之间的关系:
(1)服务器有哪些服务:Web服务(http)、ftp服务(下载)、smtp服务(邮件)、pop3服务(邮件)。
- 服务器只有一个IP地址,这不同的服务使用端口号来进行区分。
- 服务器即便没有人连接,他时刻也在端口处监听。如果有请求发来,立马返回。
(2)应用层协议和服务之间的关系: 上述服务运行之后,在TCP或UDP的某个端口,侦听客户端的请求。
- 服务分为对内服务和对外服务,只有对外服务服务器才会被监听。
(3)相关的命令
命令 |
含义 |
netstat -an |
查看自己计算机侦听的端口 |
telnet IP地址 + 端口 |
测试远程计算机打开的端口 |
安装 telnet 客户端:
命令 |
含义 |
telnet 192.168.1.1 80 |
表示访问这个 192.168.1.1 地址计算机的 web 服务 |
telnet 192.168.1.1 3389 |
表示访问这个 192.168.1.1 地址计算机的远程桌面服务 |
总结:ip 地址代表计算机,端口号:代表这台计算机的不同的服务。
端口扫描工具的使用:可以扫描出指定地址范围内,谁打开了哪些端口。
更改端口增加服务器安全,为什么可以增加安全性?
黑客喜欢攻击 80 端口,也就是服务器的 web 服务,如果我们将 web 服务的端口更改为 21 端口,黑客就无法进行攻击了。
关闭某个端口:
如果我们计算机安装了很多服务,但是我们只想其他人访问web服务,我们可以通过防火墙来打开一个固定的端口,将其他端口关闭。
案例:有一台服务器,我们只想提供 web 服务,但是此时如果所有对外的服务都打开,我们的服务器其他服务就有可能被占用,从而拉低我们整体的访问速度。
缕一缕流程
(4)windows 防火墙的作用
我们有一台服务器放在了互联网上面,有自己的公网 IP ,别人都可以进行访问,我们如何增加服务器的安全性呢?
- 对于没有使用的服务,将他的端口关掉。(只提供 web 服务,就只打开80端口)
- 通过防火墙,就可以关闭计算机的端口。
防火墙:给网卡加了一把锁
- 1、单向关闭端口:我们可以通过某个端口,主动向外发送数据。但是在别人看来,我们端口是关闭的,他们不能主动访问我们的端口。(不拦截出去的流量,只拦截进来的流量)
- 2、动态开关端口:当我们主动访问其他 web 服务的时候,这时候我们的端口会短暂的打开,用来接收响应数据包。
防火墙不能防控,灰鸽子木马程序。
一般的病毒是:客户端攻击服务连接服务器,但是如果服务器打开防火墙,客户端就无法进行攻击。
木马程序:服务器主动去访问客户端,这时候打开防火墙,就不能进行防控了。
区分正常 web 流量和 木马流量:
我们如果设置只允许 web 流量特点的流量出入。 (去查资料,看怎么进行windows 流量控制)
2、用户数据协议 UDP
(1)UDP 的报文格式
每个 UDP 报文分为 UDP 报头和 UDP 数据区两部分。
- 报头由 4 个 16 位长(2 字节)字段组成。 8 个字节组成
- 分别说明该报文的 源端口、目的端口、报文长度和校验值。
- 因为UDP一个数据包就搞定了,所以不需要进行编号。
字段 |
说明 |
源端口 |
接收端的应用程序利用这个字段的值作为发送响应的目的地址。这个字段是可选的,如果不写入端口号,则把这个字段设置为 0。这样,接收端的应用程序就不能发送响应了。 |
目的端口 |
接收端计算机上 UDP 软件使用的端口 |
长度 |
表示 UDP 数据报长度,包含 UDP 报文头和 UDP 数据长度,因为 UDP 报文头长度是 8 个字节,所以这个值最小为 8。 |
校验值 |
可以检验数据在传输过程中是否被损坏。 |
3、传输控制 TCP 协议概述
(1)TCP报文的首部格式
- 必须要有的固定字节:20个字节。 还有一个可变部分。
- 一般来说我们的数据包,20个字节就足够了, 但是有些特殊的数据包,可能不够。
- 一行有 4 个字节,所以20个字节需要5行。
名称 |
大小 |
作用 |
源端口 |
2字节 |
指定 发送端端口 |
目标端口 |
2字节 |
指定 接收端端口 |
序列号 |
4字节 |
指发送数据的位置。每发送一次数据,就会累加一次该数据字节的大小。 |
确认应答号 |
4字节 |
表示期望收到数据的开始序列号。(比如B收到了1、2、3,希望收到第4个数据包,这时候这里填4) |
数据偏移 |
4bit |
计算出的TCP报文段,第多少个字节就是真正的数据。 4bit 最大是15,但是光固定长度就有20个字节,所以数据偏移的单位是 4 个字节。(所以最大值为 15*4 =60) |
保留 |
4bit |
一般为0 |
控制位 |
1字节 |
长度8位,从左到右分别为 CWR、ECE、URG、ACK、PSH、RST、SYN、FIN |
窗口大小 |
2字节 |
表示从确认号开始,本报文的发送方可以接收的字节数,即接收窗口大小 |
检验和 |
2个字节 |
与UDP相似,区别在于无法关闭。 |
紧急指针 |
2个字节 |
只有在URG控制位为1时有效。该字段的数值表示本报文段中紧急数据的指针。 |
1、分析控制位字段
控制位的分类:
- URG标志,表示紧急指针(urgent pointer)是否有效。
- ACK标志,表示确认号是否有效。我们称携带ACK标识的TCP报文段为确认报文段。(ACK=0,确认号无效)
- PSH标志,提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空间(如果应用程序不将接收到的数据读走,它们就会一直停留在TCP接收缓冲区中)。
- RST 标志,表示要求对方重新建立连接。我们称携带RST标志的TCP报文段为复位报文段。
- SYN 标志,表示请求建立一个连接。我们称携带SYN标志的TCP报文段为同步报文段。
- FIN 标志,表示通知对方本端要关闭连接了。我们称携带FIN标志的TCP报文段为结束报文段。
分析 SYN ,ACK 标志位的作用
分析利用 TCP 协议的,建立会话机制的攻击病毒 (SYN 攻击器)
可以看到都是一些建立会话的请求,而且源地址都是瞎编的。
分析 URG 设置为1的时候的意义:
分析:
比如在传输文件:
- 发送端,一开始先将数据放到 TCP 缓存当中,排好队,然后一个一个传输。
- 突然发送端不想传输了,按下了 CTRL + C。生成一个截至命令的数据包。
- 如果 URG = 0,这个 截至命令的数据包 就得一个一个进行排队,直到缓冲区中它前面的数据发完才能发出去。
- 如果 URG = 1,这个 截至命令的数据包 就可以插队,直接插到最前面。
分析 PSH 设置为1的时候的意义:(提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空间)
- 可以看到接收端的TCP 缓冲区,排了一些数据。应用程序依次读取
- 如果 PUSH = 0,那么这个数据包必须得乖乖排队。
- 如果 PUSH = 0,这个数据包就可以进行插队,让应用程序先读取它。
2、分析窗口字段
窗口:表示从确认号开始,本报文的发送方可以接收的字节数,即接收窗口大小
理解:
- 1、缓存分为接收缓存和发送缓存。
- 2、A 给 B 发送数据的时候,A 会告诉 B,它的缓冲区里面可以接收多少个字节。
分析:当我们访问一个网站的时候,抓取的数据包,前面3个是 建立连接的数据包。
3、抓包分析TCP帧头:
流程:
第一步:ARP 协议:访问外网,就需要解析网关的 MAC 地址。
第二步:UDP 协议:进行域名解析。
第三步:TCP 协议:进行数据传输。
TCP协议建立的会话,访问一个网址,可能建立多个会话。
可以看出:
1、先进行ARP地址解析
2、DNS 服务器解析域名
3、TCP 建立连接
访问百度的时候,TCP建立连接的3个数据包:(3次握手)
- 可以看出建立连接的三个数据包,不仅仅是为了测试网络是否联通,而且还约定了一些东西
- syn:表示请求建立连接
- MSS:Maximum Segment Size ,TCP提交给IP层最大分段大小。 (1460)
- win = 64240:窗口缓存大小为 64240个字节。
接下的数据包就是正常通讯的数据包:
怎么理解序号、和确认号呢?
第一次:客户端——> 服务器
- 序号 = 1 :说明后面的数据,是 客户端发送给服务器的第一个字节。
- 确认号 = 1:说明客户端还没有收到服务器返回的数据,希望他可以返回第一个字节的数据。
- 数据大小:203 个字节
第二次:服务器——> 客户端
- 序号 = 1 :说明后面的数据,是 服务器发送给客户端的第一个字节。 (但是实际上没有)
- 确认号 = 204 :说明服务器已经收到了客户端发送的 203 个字节数据,希望返回第 204 个字节数据。
- 数据大小:0 个字节
第三次:服务器——> 客户端
- 序号 = 1 :说明后面的数据,是 服务器发送给客户端的第一个字节。 (但是实际上没有)
- 确认号 = 204 :说明服务器已经收到了客户端发送的 203 个字节数据,希望返回第 204 个字节数据。
- 数据大小:1460 个字节
第四次:服务器——> 客户端
- 序号 = 1461 :说明后面的数据,是 服务器发送给客户端的第 1461 个字节。 (但是实际上没有)
- 确认号 = 204 :说明服务器已经收到了客户端发送的 203 个字节数据,希望返回第 204 个字节数据。
- 数据大小:593 个字节
第五次:客户端——> 服务器
- 序号 = 204 :说明后面的数据,是 客户端发送给服务器的第 204 个字节。
- 确认号 = 2054:说明客户端已经收到了服务器发送的 2053 个字节,希望他可以返回第 2054 个字节的数据。
- 数据大小:0 个字节
(2)TCP 协议的主要特点
适用于:数据包很大,分段传输,数据包进行编号,丢包之后进行重新传输。
- TCP是面向连接的传输层协议。(在传输之前进行三次握手)
- 每一条TCP连接只能有两个端点(endpoint),每一条TCP连接只能是点对点的(一对一)
- TCP提供可靠交付的服务, 流量控制,避免网络拥塞
- TCP 提供全双工通信,面向字节流。
怎么理解TCP的全双工通信?
即便是单方向的下载文件,发送端在发送一段时间后,也会向
TCP 协议如何以字节流的方式来传输数据:
传输的时候,一个字节为一个数据包是不确定的。
数据包在进入接收方TCP缓存之后,帧头就会被去掉。
接收方,应用从TCP缓存里面读取数据包的时候,可以随意的读取,因为帧头已经去掉了。
- 首先将文件,分成一个一个字节。字符文件(文本)本来就是一个字节,二进制文件(图片,音频)8bit、8bit来进行划分。
- 发送方和接收方都有一个 TCP 缓存,应用层每次加载到缓存的字节数目不一定。
TCP 的连接
- TCP把连接作为最基本的抽象, 每一条TCP连接有两个端点。
- TCP连接的端点不是主机,不是主机的IP地址,不是应用进程,也不是传输层的协议端口。TCP 连接的端点叫做套接字(socket)。
- 端点 = 套接字(socket) = IP地址 + 端口号
- 一个TCP 连接 = 2个套接字 = 2个IP地址 + 2个端口号
1、我们主要关注:
- TCP 协议如何实现 可靠传输
- TCP 协议如何实现 流量控制
- TCP 协议如何避免 网络拥塞
4、要关注的3个问题
(1)TCP 如何实现可靠传输
1、停止等待协议
分析:
网络层:只管传输,不管丢包怎么办,相当于快递公司。
传输层:TCP 协议要实现可靠传输。相当于用户。
无差错情况
- A先发送 M1之后,必须先等待B的通知,不能自己贸然发送 M2。
- B收到 M1 之后,反过来给 A 一个 ack,告诉 A M1已经收到了,你可以继续发送 M2 了。
- 依次类推。
超时重传情况:
- A先发送 M1之后,必须先等待B的通知,不能自己贸然发送 M2。
- 此时网络层出现丢包,B没有收到,所以就不能给A发送 ack。
- 等待一段时间,A 没有收到B 的ack,此时 A 会继续重新发送 M1 .(因为认为这个包已经丢了)
确认丢失:(B给A 的 ack 丢失了)
- B 给A 的 ack 丢失之后,A 照样收不到B的响应,所以只能重新发送 M1。
- B 会重复接收一个 M1,此时 B 将重复的M1丢掉,然后重新发送一个 ack
确认迟到:(B给A的 ack 很晚才到)
- 确认迟到之后,A 会认为 B 的ack 已经丢失了,继续重新发送 M1。
- 等 A 再次收到 ack ,然后将这个重复的 ack 丢掉。
停止等待协议的缺点:信道利用率低
如何提高信道利用率:流水线传输 (不等待确认就直接传输,现在大部分用这个)
疑问:流水线传输如何实现可靠传输呢?
再次进行提高效率:累计确认
没有出现丢包:返回最后收到那个数据包的 ack
出现丢包:返回丢包之前那个数据包的 ack
2、以字节为单位的滑动窗口技术
(1)A 的发送窗口:是由B的接收窗口决定的。
TCP 建立连接的时候:
B 给 A 发送数据包,告诉A自己的接收窗口是20,则A发送数据的时候,会将自己的发送窗口设置为20。
(2)分析滑动窗口的作用
分析发送过程:A 给 B发送数据的过程
- 发送第一个数据包,大小为3个字节。
- 不需要等待B的回应,继续发送剩下的数据包。 (等待回应的时间太长了)
- 发送窗口当中的数据全部发送完之后,没有接受到回应的话,缓存就不能删除,窗口就不能滑动。
- 此时B连续收到两个数据包,123 和 456,这时候只需要返回一个确认信息就够了。
- B给A返回确认信息, ACK == 1, 确认号返回 7。
- A 收到确认号之后,A 就确保B已经成功收到了,前两个数据包。
- A 就可以从发送缓存当中,删除前两个数据包的内容,A 的窗口就可以进行滑动。
- 同理,当 B确认之后,B的接收窗口也可以进行滑动。
- 窗口当中新添加进来的数据包,就可以继续进行发送。
- 当数据包被 B 确认接收好之后,应用程序就可以对接受好的数据包进行读取。
- 依次类推,重复以上步骤。
(3)传输过程当中,如果有数据包丢失了怎么办?
- 收到第一个数据包和第三个数据包,中间第二个数据包丢失了。
- 那么B返回的确认号是哪一个呢?
- 返回的确认号是: 7
- 之前:ACK = 1 ,确认号 = 7,A 就会重新发送标号为 7 以后的所有数据包。
- 选择性确认:SACK = 1,确认号 = 7,告诉A计算机只丢失了第二个计算机,所以A就只发送第二个数据包。
(4)重传超时时间的选择:
原理:TCP每发送一个报文段,就对这个报文段设置一次计时器。只要计时器设置的重传时间到但还没有收到确认,就要重传这一报文段。
(2)拥塞控制
提问:网络堵塞是由两个计算机造成的,还是由一堆计算机造成的呢?
答案:就像是堵车一样,是所有车造成。
定义:在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就要变坏,这种情况就叫做网络拥塞。
举例:比如我们网线的传输带宽是 50M ,但是所有人传输的总和已经大于 50M,所以一定会发生堵塞。
吞吐量:吞吐量是指对网络、设备、端口、虚电路或其他设施,单位时间内成功地传送数据的数量(以比特、字节、分组等测量)。
假如路由器的处理带宽是 1秒钟100字节, 路由器内部也是有操作系统的,也有 CPU ,也有内存,如果我们1秒钟传输 500 个字节,就会直接将路由器堵死机,发生死锁吞吐量为0。
当输入的负载到达一定程度 吞吐量不会增加,即一部分网络资源会丢失掉。
- 理想情况:(绿色)k=1,斜率等于1, 输入多少数据,就可以成功传输多少数据。
- 无拥塞控制:(红色)超出带宽的时候,吞吐量不会增加,发生死锁。
- 实际情况:(蓝色) TCP有拥塞控制,可以避免出现网络吞吐量为0的情况。
1、慢开始算法原理
- 第一轮,先发送 1 个,没有丢包说明网络良好,下次增加数据包数量。
- 第二轮,再发送 2 个,没有丢包说明网络良好,下次增加数据包数量。
- 第三轮,再发送 4 个,没有丢包说明网络良好,下次增加数据包数量。
- 第四轮,再发送 8 个,没有丢包说明网络良好,下次增加数据包数量。
- 每次增加,以2倍的数量进行增加。
- 如果出现丢包,则停止增加。
- 传输轮次:第几次发送的意思, 拥塞窗口:一次发送数据包的个数。
- 可以看出,第4次达到了 16 个数据包(因为它从第0次开始计算)
慢开始门限值:这个值以后的数据包增长个数,一个一个进行增长。
- 此处慢开始门限值为:16,所以之后的是 17,18,19,20
- 当一次输出24个数据包的时候,发生了丢包,也就是网络堵了。
当出现拥塞的时候,发送超时重传的时候,发送丢包的时候。有两个动作。
- 1、将ssthresh的值更新为发生拥塞时的cwnd的一半;(24 变成了 12)
- 2、将cwnd的值减少为1,并重新开始执行慢开始算法。
然后从 1 在开始增长。
- 指数型增长:1、2、4、8、(本应该是 16,因为门限值为12),所以就在12停留。
- 加法增大:(一个一个增大),12、13、14、15、16
“拥塞避免”并非指完全能够避免了拥塞。利用以上的措施要完全避免网络拥塞还是不可能的。
“拥塞避免”是说在拥塞避免阶段把拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞。
2、快重传举例
快重传:顾名思义,传输丢包,发送方快速重新传送。
假设一次发送 5 个数据包。
当接收方,成功接收到第3个数据包的时候,就可以确定是中间 第 2 个已经丢包了。
原本传输的情况:(发5个数据包之后,才会有累计确认)
- 没有快重传的话,就必须等到,第五个传输完毕,才可以让发送方重新传输。
- 其实后面就没有必要了,因为确认号为 2 ,发送方会将 2、3、4、5 都重新传输一下。
快速重传:
- 拥有快速重传,直接不进行等待,后面4个数据包都认为有没有收到,都直接返回 2 。
- 不进行等待,所以会提高效率。
3、快恢复
快恢复:
发生网络拥塞的时候,拥塞窗口不会变为1,而是直接进入 “加法增大” 的情况。
(3)TCP 的传输连接管理
可以参考这边博客:https://blog.51cto.com/jinlong/2065461
传输连接有三个阶段:
TCP连接的建立都是采用客户服务器方式。
怎么区分客户端和服务器:
(1)主动发起连接建立的应用进程叫做客户(client)。
(2)被动等待连接建立的应用进程叫做服务器(server)。
1、三次握手建立TCP连接
第一次握手:
- TCP首部标记位: SYN = 1,ACK = 0,说明这个数据包是一个同步数据包,而且没有确认号。
- seq = x,x代表任意一个数值。(由A计算机指定:代表计算机A给B发送第y个字节)
- B 计算机收到这样一个数据包的时候,就明白了有个计算机想要和他建立连接。
第二次握手
- TCP首部标记位: SYN = 1,ACK = 0,说明这个数据包是一个同步数据包,有确认号。
- seq = y,y代表任意一个数值。(由B计算机指定:代表计算机B给A发送第y个字节)
- ack = x+1, 代表B计算机已经收到了 x 个字节,B 想让A计算机发送第 x + 1个字节。
第三次握手:
- SYN没有做要求
- ACK = 1:说明有确认号
- seq = x+1 :说明A已经收到B的确认号,准备给B发送第 x + 1个字节。
- ack = y+1 :说明 A 渴望收到 B 的第 y + 1个字节
三次握手过程当中的状态变化:
没有握手之前:都是 closed ,关闭状态。
第一次握手:A 变成了 syn-send (代表发送方), B为 listen 。
第二次握手:A 仍然为 syn-send ,B变为 syn-rcvd (代表接收方)。
第三次握手:A 和B都变为了 establish ,建立连接的状态。
访问一个不存在的网址:所以客户端会一直处于 send 状态,但是过一会就没有了。
SYN 攻击,使用伪造地址来和服务器进行连接,但是服务器找不到这个ip地址。
可以看出这些地址都是瞎写的。
本来两个数据包就可以验证是否有丢包,告诉对方自己的窗口有多大。为什么要有第三次的确认?
假设一个情况:客户A第一次握手的时候,选择了一个比较远的路由,导致客户A进行重新传输。
两次握手:
- 只是超时重传,并没有丢包,只是B会晚一点接收到。
- 第一次进行握手的时候,B就会发送响应,等待 A 传输数据。
- B会发送两个响应,因为有一个接收的比较晚,所以同理也会等待两个数据传输。
- 但是A只会响应一个,所以造成了 B 的资源浪费。
三次握手:
- B在等待A回应之后,才会等待传输数据,所以会避免资源浪费。
举例:
2、TCP 的连接释放
什么情况会进行释放:访问网页的时候,页面已经全部显示,不需要传输了,需要释放连接。
第一次挥手:
- TCP首部标记位: FIN = 1,ACK = 0,说明这个数据包是一个结束数据包,而且没有确认号。
- seq = u,u代表任意一个数值。(由A计算机指定:代表计算机A给B发送第u个字节)
- B 计算机收到这样一个数据包的时候,就明白了有个计算机想要和他断开连接。
第二次挥手:(数据传输阶段)
- 此时只是A发送了 FIN = 1 的信号,说明 A 的发送端已经关闭,但是B还能给A发送。
- ACK = 1,seq=v,ack = u+1
第三次挥手:
- TCP首部标记位: FIN = 1,说明这个数据包是一个结束数据包。
- ACK = 1,说明有确认号
- seq = v,v代表任意一个数值。(由A计算机指定:代表计算机A给B发送第v个字节)
- ack = u+1
第四次挥手:
- ACK = 1,seq=u+1,ack = w+1
等待两份钟:客户端进行 closed 状态
- 防止服务器没有收到,客户端的第四次挥手。
- 万一服务器没有收到,客户端还可以进行重新响应,重新发送第四次挥手