回顾和前提知识:
网络层IP协议:网际控制报文协议ICMP,网际组管理协议IGMP,地址解析协议ARP和选路协议(RIP最短路径,OSPF最好带宽,BGP发言人外部网关协议)
传输层协议:TCP流模式,UDP数据包模式
应用层:http网页协议,https,ftp站点,DNS域名解析,SMTP发邮件协议,PoP3收邮件协议,RDP远程桌面协议
传输层两个协议的应用场景:
TCP:分段 编号(为了拼接) 流量控制 需要建立会话 netstat -n命令可以查看会话
UDP:一个数据包就能完成数据通信 不建立会话 多播(不可靠传输)
(QQ聊天是使用的是UDP协议,QQ传输文件是TCP协议可靠传输,根据不同的应用使用了不同的传输协议)
5.1传输层的功能
一、OSI七层模型和TCP/IP四层模型
传输层最大数据包是65535字节,而网络层数据最大只有1480字节。所以需要分段,但是只要分段,就有可能丢包,因为网络层不负责可靠传输。所以要求服务器和客户端保持会话,直到数据传输完成。
TCP(Transmission Control Protocol)传输控制协议
应用场景:需要将要传输的文件分段传输时;就需要TCP协议来建立会话实现可靠传输;同时也有流量控制功能。(例如QQ传文件)
查看会话 netstat -n
查看建立会话的进程 netstat -nb
UDP(User Data Protocol)用户数据报协议
应用场景:一个数据包就能完成数据通信;不需要建立会话和流量控制;多播/广播;是一种不可靠传输。(例如QQ聊天,屏幕广播)
二、传输层和应用层之间的关系
- TCP和UDP协议和不同的端口即可对应一个应用层的协议。注意,53大部分是与UDP相连。
- 熟知数值一般为0-1023;登记端口号数值1024-49151(为没有熟知端口号的应用程序使用的),客户端口号数值为49152-65535(留给客户进程选择暂时使用)。
- 常用的应用层协议使用的端口(号):
ftp = TCP + 21
telnet = TCP + 23
SMTP = TCP + 25
DNS = UDP + 53 或 TCP + 53
http = TCP + 80
POP3 = TCP + 110
Https = TCP + 443
共享文件夹 = TCP + 445
SQL = TCP + 1433
RDP = TCP + 3389
(以上的端口是可以更改的)
- 端口号只具有本地意义,即端口号只是为了标志本计算机应用层中的各进程。在因特网中不同计算机的相同端口号是没有联系的。
关于端口的补充:
运行在计算机中的进程是用进程标识符来标志的。运行在应用层的各种应用进程却不应当让计算机操作系统指派它的进程标识符。这是因为在因特网上使用的计算机的操作系统种类很多,而不同的操作系统又使用不同格式的进程标识符。为了使运行不同操作系统的计算机的应用进程能够互相通信,就必须用统一的方法对 TCP/IP 体系的应用进程进行标志。
解决这个问题的方法就是在运输层使用协议端口号(protocol port number),或通常简称为端口(port)。虽然通信的终点是应用进程,但我们可以把端口想象是通信的终点,因为我们只要把要传送的报文交到目的主机的某一个合适的目的端口,剩下的工作(即最后交付目的进程)就由 TCP 来完成。
三、应用层协议和服务之间的关系
防火墙是基于网卡的,只打开必要的端口,不必要的端口不允许接收数据,不影响服务的运行和监听。
服务使用TCP或UDP的端口侦听客户端请求;
客户端使用IP地址定位服务器,使用目标端口,定位服务;
可以在服务器网卡上设置只开放必要的端口,实现服务器网络安全。
- 用端口来定位服务,用IP地址来定位计算机
- 服务(对外)运行后在TCP或UDP的某个端口监听客户端的请求
- 如果装了一个服务不能访问,可能原因是服务没有启动,这时需要手动的启动服务,端口监听。
操作1:查看自己计算机的监听端口
netstat -a
netstat -an 以数字的形式查看端口
netstat -n 查看建立的会话
netstat -nb 查看建立会话的进程
telnet 192.168.80.100 3389 测试到远程计算机某个端口是否打开
命令:netstat -an
操作2:在Win10添加服务,自行选择
(DNS服务,Web服务,SMTP服务,POP3服务)
点击程序功能
选择需要下载的服务
操作3:手动设置端口开启
操作4:筛选服务端口,设置Windows网络安全
打开控制面板的防火墙
点击高级设置
点击入站或者是出站规则,然后新建规则
选择端口,然后根据端口一步步设置便可
操作5:Windows防火墙的作用,将所有服务端口关闭
不拦截出去的流量,但是拦截进来的流量。
但是木马程序是服务器,连接客户端来连接计算机,防火墙不能起作用。此时可以限制端口访问,或者全关服务。
操作6:利用PoP3服务配置邮箱和发送邮件
四、传输层为相互通信的应用进程提供了逻辑通信
- 两个主机进行通信实际上就是两个主机中的应用进程互相通信。
- 应用进程之间的通信又称为端到端的通信。
- 运输层的一个很重要的功能就是复用和分用。应用层不同进程的报文通过不同的端口向下交到运输层,再往下就共用网络层提供的服务。
- “运输层提供应用进程间的逻辑通信”。“逻辑通信”的意思是:运输层之间的通信好像是沿水平方向传送数据。但事实上这两个运输层之间并没有一条水平方向的物理连接。
五、传输层协议和网络层协议的主要区别
- 网络层实现如何把数据包从这个地址(服务器)发送到另一个地址(服务器)。
- 传输层实现如何让这个应用程序找到对应计算机的应用程序(相对应的应用程序实现逻辑通信)。
六、传输层的主要功能
传输层为应用进程之间提供了端到端的逻辑通信(但网络层是为主机之间提供逻辑通信)。
传输层还要对收到的报文进行差错检验。
传输层提供面向连接(TCP)和无连接(UDP)的服务。
七、传输层的端口
八、两种不同的传输协议
- 运输层向高层用户屏蔽了下面网络核心的细节(如网络拓扑、所采用的路由选择协议等),它使应用进程看见的就是好像在两个运输层实体之间有一条端到端的逻辑通信信道。
- 当运输层采用面向连接的 TCP 协议时,尽管下面的网络是不可靠的(只提供尽最大努力服务),但这种逻辑通信信道就相当于一条全双工的可靠信道。
- 当运输层采用无连接的 UDP 协议时,这种逻辑通信信道是一条不可靠信道。
5.2传输层协议UDP和TCP
TCP/IP 的运输层有两个不同的协议:
用户数据报协议 UDP (User Datagram Protocol)
传输控制协议 TCP (Transmission Control Protocol)
一、TCP与UDP
- 两个对等运输实体在通信时传送的数据单位叫作运输协议数据单元 TPDU (Transport Protocol Data Unit)。TCP 传送的数据单位协议是 TCP 报文段(segment)。 UDP 传送的数据单位协议是 UDP 报文或用户数据报。
- UDP 在传送数据之前不需要先建立连接。对方的运输层在收到 UDP 报文后,不需要给出任何确认。虽然 UDP 不提供可靠交付,但在某些情况下 UDP 是一种最有效的工作方式。
- TCP 则提供面向连接的服务。TCP 不提供广播或多播服务。由于 TCP 要提供可靠的、面向连接的运输服务,因此不可避免地增加了许多的开销。这不仅使协议数据单元的首部增大很多,还要占用许多的处理机资源。
二、UDP协议
1、UDP协议的介绍
UDP是无连接的,即发送数据之前不需要建立连接。
UDP使用尽最大努力交付,即不保证可靠交付,同时也不使用拥塞控制。
UDP是面向报文的,适合多媒体通信的要求。
UDP支持一对一,一对多,多对一,多对多交互通信。
UDP首部开销小,只有8个字节
2、UDP的首部格式
含有源端口和目的端口
用户数据报 UDP 有两个字段:数据字段和首部字段。首部字段有 8 个字节,由 4 个字段组成,每个字段都是两个字节。
在计算检验和时,临时把“伪首部”和 UDP 用户数据报连接在一起。伪首部仅仅是为了计算检验和。
三、TCP协议
学习TCP协议主要解决三个问题:
TCP协议如何实现可靠传输
TCP协议如何实现流量控制
TCP协议如何避免网络拥塞
1、TCP协议的特点
TCP是面向连接的传输层协议。(三次握手,确保网络没有问题才开始传输)
每一条TCP连接智能有两个端点(endpoint),每一条TCP连接只能时点对点的(一对一)。
TCP提供可靠交付的服务。(确保不丢包)
TCP提供全双工通信。(因为需要接收端的反馈,例如如果接收端处理不过来,可让发送端慢一点,流量控制)
面向字节流。
如果要传输一个比较大的数据,首先一次只会传输一小块,这个数据块的大小是没有规律的。加上数据包数据帧的头,发送给接收端,接收端去掉首部,再次拼接起来。
2、TCP的连接
TCP把连接作为最基本的抽象。
每一条TCP连接有两个端点。
TCP连接的端点不是主机,不是主机的IP地址,不是应用程序,也不是传输层协议端口,TCP连接的端点叫 套接字(socket).
套接字socket = (IP地址:端口号)
每一条TCP连接唯一地被通信两端的两个套接字所确定,即:
TCP连接 ::= {socket1, socket2} = {(IP1:port1), (IP2:port2)}
端口号拼接到(contatenated with) IP 地址即构成了套接字。
5.3TCP的可靠性传输实现
一、可靠传输的工作原理—停止等待协议
无差错情况的默认行为:只要不确认,就重传
超时重传的默认行为:没有告诉M1收到了,所以还是会重传
确认丢失的默认行为:确认的包丢失了,没有收到确认收到还是会重传,但是B已经收到了所以重新确认收到M1,但是新的M1会丢弃
确认迟到的默认行为:确认收到的包走了原路教慢的传到了A中,但是A还是会重传M1,直到收到确认。但是第二个M1的确认就会忽视。
使用上述的确认和重传机制,我们就可以在不可靠的传输网络上实现可靠的通信。这种可靠传输协议常称为自动重传请求ARQ (Automatic Repeat reQuest)。
ARQ 表明重传的请求是自动进行的。接收方不需要请求发送方重传某个出错的分组 。
注意:
在发送完一个分组后,必须暂时保留已发送的分组的副本。
分组和确认分组都必须进行编号。
超时计时器的重传时间应当比数据在分组传输的平均往返时间更长一些。
二、信道利用率
停止等待协议的优点是简单,但缺点是信道利用率太低
参数分析:
TD:A发数据包所需要的时间
TA:B收确认数据包所需要的时间(比较固定)
RTT:数据包传输的往返时间(固定的)
U:信道利用率(发数据包的时间和总共所需要时间的比值)
只需要提高TD,就可以提高信道利用率,让其一直发包。
三、流水线传输
流水线传输是为了提高TD,提高信道利用率。
发送方可连续发送多个分组,不必每发完一个分组就停顿下来等待对方的确认。由于信道上一直有数据不间断地传送,这种传输方式可获得很高的信道利用率。
1、流水线传输的可靠性原理 ----- 连续ARQ协议
到收到1的应答信号时,就可以将1从缓存信号中丢弃不再需要。发送窗口向右移动,此时6被框柱了,所以也就将6发送出去。不断移动,依次类推。
在发送窗口中的数据不能删除缓存,必须等到对应的ACK应答信号才可以清除。
如果12收到了,3没有收到,则滑动窗口会会回溯到3位置,重新发送。
2、累积确认 ----- 提高确认回复效率
接收方一般采用累积确认的方式。即不必对收到的分组逐个发送确认,而是对按序到达的最后一个分组发送确认,这样就表示:到这个分组为止的所有分组都已正确收到了。
如果3收到了,B向1发了一个3的确认收到回复,就表示1,2也确认了。
如果3没有收到,但是1,2,4收到了,B就会向A发一个2确认收到的回复,4需要重传。
优点:容易实现,信道利用率高。
缺点:不能向发送方反映出接收方已经正确收到的所有分组的信息。
四、TCP 可靠通信的具体实现
TCP 连接的每一端都必须设有两个窗口——一个发送窗口和一个接收窗口。
TCP 的可靠传输机制用字节的序号进行控制。TCP 所有的确认都是基于序号而不是基于报文段。
TCP 两端的四个窗口经常处于动态变化之中。
TCP连接的往返时间 RTT 也不是固定不变的。需要使用特定的算法估算较为合理的重传时间。
五、以字节为单位的滑动窗口技术
1、正常状态(无丢包)
在没有收到B确认收到之前,A不能删掉滑动窗口内的内容。A可以持续给B发送,直到A的滑动窗口内数据都发了。A的发送窗口是由B的接受窗口长度决定的。(接受窗口决定发送窗口)
B收到后给A发确认收到的反馈ACK,序号是下一个应该发送的字节的序号。(确认号是7,序列号是1)。A收到后,就可以滑动窗口到对应的位置。例如B反馈ACK是7,那么A的滑窗可以移动到7位置,1-6删除。21-26可以发送。
B收到1-6之后,也开始滑窗,B的应用程序可以读取1-6的数据。B的滑窗继续接收。
2、出现丢包情况
如丢失情况,例如7-9丢失,此时B反馈的ACK=7.因为10-12收到了,因此B发送SACK(选择性确认),A只发送7-9,不必再重新发送10-12
接着A便再不断的发送13及后面的数据,最终B收到了一个连续的直接,如下所示,便会给A确认(确认号是16),A就可以往前移动窗口。(没收到一个确认都会移动发送窗口,当然接受窗口也是对照的移动)
六、超时重传时间的选择
TCP美发送一个报文段,就对这个报文段设置一次计时器。只要计时器设置的重传时间到了,但是还没有收到数据,那么就重传这一报文段。
RTTs(new) = (1 - alpha) x (RTTs(old)) + alpha x (new RTT样本)
超时重传时间应略大于上面得出的加权平均往返时间RTTs。alpha推荐值是0.125.
这个公式的目的是根据网速和带宽的实时情况调整往返时间。
5.4TCP的流量控制实现
一、TCP 报文段的首部格式
以下是各字段的介绍:
源端口和目的端口字段——各占 2 字节。端口是运输层与应用层的服务接口。运输层的复用和分用功能都要通过端口才能实现。
序号字段——占 4 字节。TCP 连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。
确认号字段——占 4 字节,是期望收到对方的下一个报文段的数据的第一个字节的序号。
数据偏移(即首部长度)——占 4 位,它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远,也就是当前TCP报文段第多少个字节后是TCP的数据部分了。数据偏移最多表示1111,即15,他最多可以表示15乘以4,即60个字节的偏移量,所以选项+填充最多只能是40个字节。
保留字段——占 6 位,保留为今后使用,但目前应置为 0。
紧急 URG —— 当 URG = 1 时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送,最好不要排队(相当于高优先级的数据)。
确认 ACK —— 只有当 ACK = 1 时确认号字段才有效。当 ACK = 0 时,确认号无效。
推送 PSH (PuSH) —— 接收 TCP 收到 PSH = 1 的报文段,就尽快地交付接收应用进程,而不再等到整个缓存都填满了后再向上交付。
复位 RST (ReSeT) —— 当 RST = 1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。
同步 SYN —— 同步 SYN = 1 表示这是一个连接请求或连接接受报文,要发起会话。 (发送会话请求和同意会话)
其中,利用同步SYN字段可以制造一些程序对目标的主机进行攻击。
syn攻击:伪造大量的不存在的地址请求,占用xp电脑CPU资源
land攻击:目标地址和原地址都是xp自己,也就是让xp给自己建立大量的会话,让其把自己CPU资源奔溃
终止 FIN (FINis) —— 用来释放一个连接。FIN = 1 表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。
窗口字段 —— 占 2 字节,用来让对方设置发送窗口的依据,单位为字节。例子如下:(接受窗口确定发送窗口)
检验和 —— 占 2 字节。检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,要在 TCP 报文段的前面加上 12 字节的伪首部。
紧急指针字段 —— 占 16 位,指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)。
选项字段 —— 长度可变。TCP 最初只规定了一种选项,即最大报文段长度 MSS。MSS 告诉对方 TCP:“我的缓存所能接收的报文段的数据字段的最大长度是 MSS 个字节。” (MSS (Maximum Segment Size)是 TCP 报文段中的数据字段的最大长度。数据字段加上 TCP 首部才等于整个的 TCP 报文段。)
填充字段 —— 这是为了使整个首部长度是 4 字节的整数倍。
二、抓包分析
1、会话建立过程中的协议步骤
第一步—ARP:上外网需要解析网关的MAC地址,建立可靠传输
第二步—UDP:域名解析
第三部—TCP:访问网站
(这也是为什么先有ARP,再有DNS,最后TCP访问网站)
操作:查看会话
命令:netstat -n (可见当前是建立了两个会话)
2、各步骤数据包信息分析
浅蓝:请求的数据包;深蓝:得到的结果。192.168.80.66是我方地址;8.8.8.8是服务器地址;
两个SYN是双方确认建立了会话,MSS意思是最大数据包1460字节,web端(219.148.36.48)最多能缓存win=64240字节,我端(192.168.80.63)最多能缓存win=65535字节,如果某一方发了另一方win字节个数据对方都没有确认,那么就暂停。标记为TCP这三行(12,13,14),不光是建立对话,还协商了一些参数。
第15行,开始正式通信,HTTP。GET的意思是我要访问这个网站了。白框内写着各个层的数据首部的结构。
可以查看传输层的数据包信息,源端口Dst Port是1057,目标端口Src Port是80,序号Sep是1,确认号Ack是1,数据部分长度是1-203字节。
219->192是发送网页信息,192->219是确认反馈。注意,16第一次发送数据和19反馈接收是没有数据len=0。
3、会话建立具体过程
从建立会话,到传输数据到确认反馈的一个过程如下(15-19过程):
过程分析如下:
xp向Web站点发送了一个数据包。目标端口是80;源端口是1057;序列号是1表示这个数据包的数据是整个数据的第一个字节;确认号也是1;这个数据包的数据部分有1-203这么多个字节。
Web站点发了一个回返数据包给xp。目标端口是1057;源端口是80;序列是1表示网站给xp数据中的第一个数据所以是1;确认号是204表示确认收到了xp前一步发送的203个数据,现在是想xp发送第204以后的字节;不过这个数据包的长度是0,只有一个首部没有其他数据。
Web站点又发了一个回返数据包给xp真正的开始发数据。目标端口是1057;源端口是80;序列是1表示因为上一个包没有发数据,所以网站给xp数据中的第一个数据还是1;确认号还是204因为还是想xp开始发204以后的数据但是xp还没有发所以保持不变知道xp发了数据;这个数据包的数据部分有1-1460这么多个字节。
Web站点又发了一个回返数据包给xp。目标端口是1057;源端口是80;序列号是1461因为上一个数据包发了1460个数据;确认号还是204保持不变;这个数据包的长度是593,从1461开始,再加592,所以数据包部分是1461-2053字节。
此时xp向Web站点发了一个数据包。目标端口是80;源端口是1057;序列号是204表示之前这个数据已经发送了203个字节,现在从204开始;确认号是2054表示收到了Web站点之前发送的2054个数据;不过这个数据包的长度同样是0,只有一个首部没有其他数据。
三、流量控制的实现
解决通信两端处理时间不一样的问题。通过实时调整滑窗尺寸的大小(尺寸甚至可以是0)来实现流量控制。接收端主动调整滑窗大小,发送端根据接收端发送的报文调整相应的滑窗。发送端也会定时发送报文向接收端确认滑窗信息,避免接收端发送的相关调整滑窗大小的报文丢失带来的影响。
5.5TCP的拥塞控制实现
一、拥塞控制与流量控制的关系
出现资源拥塞的条件: 对资源需求的总和 > 可用资源
拥塞控制所要做的都有一个前提,就是网络能够承受现有的网络负荷。
拥塞控制是一个全局性的过程,涉及到所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素。
流量控制往往指在给定的发送端和接收端之间的点对点通信量的控制。 流量控制所要做的就是抑制发送端发送数据的速率,以便使接收端来得及接收。
二、拥塞控制起到的作用
红线和绿线之间是与理想相比实际情况下数据丢失内容。
三、慢开始和拥塞避免
1、控制拥塞窗口的原则
只要网络没有出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去;
只要网络出现拥塞,拥塞窗口就减少一些,以减少注入到网络中的分组数。
2、慢开始算法的原理
3、慢开始门限状态变量ssthresh设置
慢开始门限状态变量ssthresh的用法如下:
当cwnd
当cwnd>ssthresh时,停止使用慢开始算法,改用拥塞避免算法;
当cwnd=ssthresh时,使用慢开始算法或拥塞避免算法均可;
4、拥塞避免算法的思路
让拥塞窗口cwnd缓慢地增大,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍,使拥塞窗口cwnd按线性规律缓慢增长。
5、当网络出现拥塞时对策
无论是在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有按时收到确认),就要把慢开始门限ssthresh设置为出现拥塞时的发送方窗口值的一半(但是不能小于2)。
然后把拥塞窗口cwnd重新设置为1,执行慢开始算法。
这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够的时间吧队列中积压的分组处理完毕。
6、慢开始和拥塞避免算法的实现举例
过程分析:
当 TCP 连接进行初始化时,将拥塞窗口置为 1。图中的窗口单位不使用字节而使用报文段。慢开始门限的初始值设置为 16 个报文段,即 ssthresh = 16。
发送端的发送窗口不能超过拥塞窗口 cwnd 和接收端窗口 rwnd 中的最小值。我们假定接收端窗口足够大,因此现在发送窗口的数值等于拥塞窗口的数值。
在执行慢开始算法时,拥塞窗口 cwnd 的初始值为 1,发送第一个报文段 M0。
发送端每收到一个确认 ,就把 cwnd 加 1。于是发送端可以接着发送 M1 和 M2 两个报文段。
接收端共发回两个确认。发送端每收到一个对新报文段的确认,就把发送端的 cwnd 加 1。现在 cwnd 从 2 增大到 4,并可接着发送后面的 4 个报文段。
发送端每收到一个对新报文段的确认,就把发送端的拥塞窗口加 1,因此拥塞窗口 cwnd 随着传输轮次按指数规律增长。
当拥塞窗口 cwnd 增长到慢开始门限值 ssthresh 时(即当 cwnd = 16 时),就改为执行拥塞避免算法,拥塞窗口按线性规律增长。
假定拥塞窗口的数值增长到 24 时,网络出现超时,表明网络拥塞了。
更新后的 ssthresh 值变为 12(即发送窗口数值 24 的一半),拥塞窗口再重新设置为 1,并执行慢开始算法。
10.当 cwnd = 12 时改为执行拥塞避免算法,拥塞窗口按按线性规律增长,每经过一个往返时延就增加一个 MSS 的大小。
需要注意:
- “拥塞避免”并非指完全能够避免了拥塞。利用以上的措施要完全避免网络拥塞还是不可能的。
- “拥塞避免”是说在拥塞避免阶段把拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞。
四、快重传和快恢复
1、快重传介绍
快重传算法首先要求接收方每收到一个失序的报文段后就立即发出重复确认。这样做可以让发送方及早知道有报文段没有到达接收方。
发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段。 不难看出,快重传并非取消重传计时器,而是在某些情况下可更早地重传丢失的报文段。
2、快恢复算法
当发送端收到连续三个重复的确认时,就执行“乘法减小”算法,把慢开始门限 ssthresh 减半。但接下去不执行慢开始算法。
由于发送方现在认为网络很可能没有发生拥塞,因此现在不执行慢开始算法,即拥塞窗口 cwnd 现在不设置为 1,而是设置为慢开始门限 ssthresh 减半后的数值,然后开始执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢地线性增大。
3、发送窗口的上限值
发送方的发送窗口的上限值应当取为接收方窗口 rwnd 和拥塞窗口 cwnd 这两个变量中较小的一个,即应按以下公式确定:
发送窗口的上限值 = Min [rwnd, cwnd]
当 rwnd < cwnd 时,是接收方的接收能力限制发送窗口的最大值。
当 cwnd < rwnd 时,则是网络的拥塞限制发送窗口的最大值。
5.6TCP的传输连接管理
传输连接有三个阶段,即:连接建立,数据传送,连接释放。运输连接的管理就是使运输连接的建立和释放都能正常地进行。
一、客户服务器方式
TCP连接的建立都是采用客户服务器方式。
主动发起连接建立的应用进程叫做客户(client)。
被动等待连接建立的应用进程叫做服务器(server)。
二、TCP的连接建立
用三次握手建立TCP连接,过程分析如下:
A 的 TCP 向 B 发出连接请求报文段,其首部中的同步位 SYN = 1,并选择序号 seq = x,表明传送数据时的第一个数据字节的序号是 x。
B 的 TCP 收到连接请求报文段后,如同意,则发回确认。B 在确认报文段中应使 SYN = 1,使 ACK = 1,其确认号ack = x + 1,自己选择的序号 seq = y。
A 收到此报文段后向 B 给出确认,其 ACK = 1,确认号 ack = y + 1。A 的 TCP 通知上层应用进程,连接已经建立。
B 的 TCP 收到主机 A 的确认后,也通知其上层 应用进程:TCP 连接已经建立。
如此,连接成功建立
用三次握手建立 TCP 连接的各状态如下:
头两次握手除了确定双方都能联通外,还通知了双方的一些端口信息。
第三次握手原因:假如把三次握手改成仅需要两次握手,死锁是可能发生的。作为例子,考虑计算机A和B之间的通信,假定A给B发送一个连接请求分组,B收到了这个分组,并发送了确认应答分组。按照两次握手的协定,B认为连接已经成功地建立了,可以开始发送数据分组。可是,B的应答分组在传输中被丢失的情况下,A将不知道B是否已准备好,A认为连接还未建立成功,将忽略B发来的任何数据分组,这样就形成了死锁。
三、TCP的连接释放
用四次挥手释放TCP连接,过程分析如下:
A 的应用进程先向其 TCP 发出连接释放报文段,并停止再发送数据,主动关闭 TCP 连接。A 把连接释放报文段首部的 FIN = 1,其序号seq = u,等待 B 的确认。
B 发出确认,确认号 ack = u + 1,而这个报文段自己的序号 seq = v。TCP 服务器进程通知高层应用进程。从 A 到 B 这个方向的连接就释放了,TCP 连接处于半关闭状态。但是A此时仍然可以接受来自B的数据,只不过自己不能向B发送数据了。
若 B 已经没有要向 A 发送的数据,其应用进程就通知 TCP 释放连接。
A 收到连接释放报文段后,必须发出确认。在确认报文段中 ACK = 1,确认号 ack = w + 1,自己的序号 seq = u + 1。
TCP 连接必须经过时间 2MSL 后才真正释放掉。
用四次挥手释放的 TCP 连接的各状态如下:
参考资料
https://www.bilibili.com/video/BV17p411f7ZZ?t=107&p=110
https://blog.csdn.net/iwanderu/article/details/103812974