当前位置: 首页 > news >正文

计算机网络(五)运输层

5.1、运输层概述

概念

进程之间的通信

  • 从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层

  • 当网络的边缘部分中的两个主机使用网络的核心部分的功能进行端到端的通信时,只有位于网络边缘部分的主机的协议栈才有运输层,而网络核心部分中的路由器在转发分组时都只用到三层(到网络层)的功能。

进程之间通信流程

以上图为例:进程Ap1与Ap4之间以及进程Ap2与Ap3之间进行基于网络的通信。它们在运输层使用不同的端口,来对应不同的应用进程。然后通过网络层及其下层来传输应用层报文。接收方的运输层通过不同的端口,将收到的应用层报文,交付给应用层中相应的应用进程。

注意:此处运输层的端口是区分不同应用进程的标识符,而非物理端口。

逻辑通信:运输层之间的通信好像是沿水平方向传送数据,但事实上,这两条数据并没有一条水平方向的物理连接,要传送的数据是沿着图中上下多次的虚线方向传送的

总结


5.2、运输层端口号、复用与分用的概念

为什么用端口号

IANA:因特网数字分配机构

发送方的复用和接收方的分用

发送方的某些应用程序所发送的不同应用报文,在运输层使用UDP协议进行封装,称为UDP复用,使用TCP协议进行封装,称为TCP复用。运输层使用不同的端口号区分不同的进程。无论是UDP协议封装的UDP用户数据段还是TCP协议封装的TCP报文段,它们都会在网络层使用IP协议封装成IP数据报,而这称为IP复用。

接收方的网络层收到发送方的IP数据报后进行IP分用:如果该IP数据报首部中协议字段的值为17,则把IP数据报的数据载荷部分所封装的UDP用户数据报上交运输层的UDP,如果该IP数据报首部中协议字段的值为6,则把IP数据报的数据载荷部分所封装的TCP报文段上交运输层的TCP。运输层对UDP用户数据报进行UDP分用,对TCP报文段进行TCP分用,将它们交付给上层相应的应用进程

注意:IP数据报首部中协议字段的值,用来表明IP数据报的数据载荷部分封装的是何种协议数据单元:值为6表明封装TCP报文段,值为17表明封装UDP用户数据段

TCP/IP体系的应用层常用协议所使用的运输层熟知端口号

运输层传输流程

如图所示,以上主机通过交换器互连并处于同一个以太网中

现我们在用户PC中使用浏览器访问web服务器:输入域名,回车浏览。用户PC中的DNS客户端进程会发送一个DNS查询请求报文。该报文需要使用运输层的UDP协议封装成UDP用户数据报,其首部中的源端口字段的值,在短暂端口号49151~65535中挑选一个未被占用的(此处使用49152),用来表示DNS客户端进程,目的端口字段的值为53,是DNS服务器端进程所使用的熟知端口号。

之后,将UDP用户数据报封装在IP数据报中,通过以太网发送给DNS服务器

DNS服务器收到该IP数据报后,从中解封出UDP用户数据报。UDP首部中的目的端口号为53,这表明应将该UDP用户数据报的数据载荷部分,也就是DNS查询请求报文,交付给本服务器中的DNS服务器端进程。

DNS服务器端进程解析DNS查询请求报文的内容,然后按其要求查找对应的IP地址。之后DNS服务器会给用户PC发送DNS响应报文,DNS响应报文需要使用运输层的UDP协议封装成UDP用户数据报。 其首部中的源端口字段的值设置为熟知端口号53,表明这是DNS服务器端进程所发送的UDP用户数据报,目的端口的值设置为49152,这是之前用户PC中发送DNS查询请求报文的DNS客户端进程所使用的短暂端口号。

DNS服务器将UDP用户数据报封装在IP数据报中,通过以太网发送给用户PC

用户PC收到该数据报后,从中解封出UDP用户数据报。UDP首部中的目的端口号为49152,这表明应将该UDP用户数据报的数据载荷部分,也就是DNS响应报文,交付给用户PC中的DNS客户端进程。DNS客户端进程解析DNS响应报文的内容,就可知道自己之前所请求的Web服务器的域名对应的IP地址

现在用户PC中的HTTP客户端进程可以向Web服务器发送HTTP请求报文。

HTTP请求报文需要使用运输层的TCP协议封装成TCP报文段,其首部中的源端口字段的值短暂端口号49151~65535中挑选一个未被占用的(此处使用49152),用来表示HTTP客户端进程,目的端口字段的值为80,是HTTP服务器端进程所使用的熟知端口号。

之后,将TCP报文段封装在IP数据报中,通过以太网发送给Web服务器

DWeb服务器收到该IP数据报后,从中解封出TCP用户数据报TCP首部中的目的端口号为80,这表明应将该TCP报文段的数据载荷部分,也就是HTTP请求报文,交付给本服务器中的HTTP服务器端进程。

HTTP服务器端进程解析HTTP请求报文的内容,然后按其要求查找首页内容。之后Web服务器会给用户PC发送HTTP响应报文,其内容是HTTP客户端所请求的首页内容。HTTP响应报文需要使用运输层的TCP协议封装成TCP报文段。 其首部中的源端口字段的值设置为熟知端口号80,表明这是DNS服务器端进程所发送的TCP用户数据报,目的端口的值设置为49152,这是之前用户PC中发送HTTP请求报文的HTTP客户端进程所使用的短暂端口号。

之后将TCP报文段封装在IP数据报中,通过以太网发送给用户PC

用户PC收到该数据报后,从中解封出TCP报文段。TCP首部中的目的端口号为49152,这表明应将该TCP报文段的数据载荷部分,也就是HTTP响应报文,交付给用户PC中的HTTP客户端进程。HTTP客户端进程解析HTTP响应报文的内容,并在网页浏览器中进行显示。这样我们就可以在网页浏览器中看到Web服务器所提供的首页内容了

5.3、UDP和TCP的对比

概念

  • UDPTCP 是TCP/IP体系结构运输层中的两个重要协议

  • 当运输层采用面向连接的 TCP 协议时,尽管下面的网络是不可靠的(只提供尽最大努力服务),但这种逻辑通信信道就相当于一条全双工的可靠信道

  • 当运输层采用无连接的 UDP 协议时,这种逻辑通信信道是一条不可靠信道

可靠信道与不可靠信道

  • 两个对等运输实体在通信时传送的数据单位叫作运输协议数据单元 TPDU (Transport Protocol Data Unit)。

  • TCP 传送的数据单位协议是 TCP 报文段(segment)。

  • UDP 传送的数据单位协议是 UDP 报文用户数据报

使用UDP协议的双方,可以随时发送数据。

三报文握手和四报文挥手属于TCP的连接管理,实现较为复杂。

UDP的通信是无连接的,不需要套接字(Socket)

TCP是面向连接的,TCP之间的通信必须要在两个套接字(Socket)之间建立连接

注意:此处的连接依然是指逻辑连接关系,而非物理连接

用户数据报协议UDP(User Datagram Protocol)

其中任何一台主机都可以向其他三台主机发送广播,也可以向某个多播组发送多播,还可以发送单播,也就是说UDP支持一对一,一对多,以及一对全的通信

发送方的应用进程将应用层报文交付给运输层的UDP,UDP给每个应用层报文添加一个UDP首部使之成为UDP用户数据报,然后发送。接收方的UDP收到UDP用户数据报后,去掉UDP首部,将应用层报文交付给应用进程

UDP对应用进程交下来的报文既不合并也不拆分,而是保留这些报文的边界。换句话说,UDP是面向应用报文

发送方给接收方发送UDP用户数据报,若传输过程中用户数据报受到干扰而产生误码,接收方UDP可以通过该数据报首部中的校验和字段的值检查出产生误码的情况并丢失该数据报。

发送方给接收方发送UDP用户数据报,如果该数据报被因特网中的某个路由器丢弃了,发送方UDP不做任何处理

传输控制协议TCP(Transmission Control Protocol)

使用TCP协议的通信双方,在进行数据传输之前,必须使用三报文握手建立TCP连接

TCP连接建立成功后,通信双方之间就好像有一条可靠的通信信道,通信双方使用这条基于TCP连接的可靠信道进行通信

很显然,TCP仅支持单播,也就是一对一的通信

发送方

  • TCP会把应用进程交付下来的数据块看作是一连串无结构的字节流,TCP并不知道这些待传送的字节流的含义,仅将他们编号,并存储在自己发送缓存中
  • TCP会根据发送策略,从发送缓存中提取一定量的字节构建TCP报文并发送

接收方

  • TCP一方面从所接收到的TCP报文段中,取出数据载荷部分并存储在接收缓存中,一方面将接收缓存中的一些字节交付给应用进程
  • TCP不保证接收方应用进程所收到的数据块与发送方发送的数据块,具有对应大小的关系(例如,发送方应用进程交给发送方的TCP共10个小数据块,但接收方的TCP可能只用了4个大数据块,就把收到的字节流交付给了上层的应用进程,但接收方收到的字节流必须和发送方应用进程发出的字节流完全一样)
  • 接收方的应用进程必须有能力识别收到的字节流,把它还原成有意义的应用层数据

TCP是面向字节流的,这正是TCP实现可靠传输、流量控制、以及拥塞控制的基础

本图只画了一个方向的数据流,在实际网络中,基于TCP连接的两端,可以同时进行TCP报文段的发送和接收

使用TCP连接的双方基于TCP连接的可靠通道使用数据传输,不会出现误码,丢失,乱序以及重复等传输差错

TCP结构

总结


5.4、TCP的流量控制

概念

假设主机a发送的每100字节数据都封装成TCP报文段,b的接收窗口为400个字节数据,因此主机a的发送窗口也设置为400。主机a在未收到主机b发来的确认时,可将落入发送窗口中的全部数据发送出去

seq是tcp报文段首部中的序号字段取值,值为1表示tcp报文段数据载荷第一个字节序号为1。

date表示该数据是tcp数据报文段。

ACK表示tcp报文段首部中的标志位,值为1表示这是一个tcp确认报文段。。

ack表示tcp报文段首部中的确认号字段,值为201表示序号201之前的数据已全部接收,先希望收到序号201及其后续数据。

rwnd是报文段首部中的窗口字段,取值300表示自己的接收窗口大小为300

流量控制是根据网络波动调节的

由于主机b在该累计确认中已将自己的接收窗口调整了300,因此主机a相应的把自己的发送窗口也调整为300。

主机a收到201之前的数据的累计确认后,将发送窗口向前滑动,使已发送并收到确认的这些数据的序号移除发送窗口并将1~200的字节数据全部删除。

在上图中201-300是已发送数据,当重传计时器超时,它们仍会被重传。

当201-500的重传计时器超时时,主机a将其重新封装成一个TCP报文段发送出去,暂时不能发送新数据

在上图的最后,主机b向主机a发送零窗口通知

为解决该问题,TCP为每一个连接设置一个持续计时器。

如上图所示:主机a收到了收到主机b的零窗口通知,就启动持续计时器。当持续计时器超时,主机a发送一个零窗口探测报文,主机b收到探测报文段后发送包含其接收窗口值的确认报文。如果该值仍为0,主机a收到该报文段重新启动持续计时器。如果该值不为0,则打破死锁的局面

主机a发送的零窗口探测报文段后,启动重传计时器。当零窗口探测报文段丢失后,主机b无法收到该报文,因此主机a也无法收到确认报文,此时重传计时器就会超时,零窗口探测报文段会被重传

注意:TCP规定:即使接收窗口为0,主机也必须接收零窗口探测报文段,确认报文段以及携带紧急数据的报文段

习题

主机甲收到确认后,先滑动发送窗口再调整发送窗口

总结


5.5、TCP的拥塞控制

概念 

理想的拥塞控制:当输入负载达到某一限度时,由于网络资源受限,吞吐量不再增长,达到饱和。此时加大输入负载,则会损失数据

无拥塞控制:在未达到吞吐量饱和前,就有部分输入分组被丢弃。当网络吞吐量明显小于理想吞吐量时,网络进入轻度拥塞状态。当输入负载达到某一数值时,网络吞吐量随输入负载增大而降低,进入拥塞状态直到死锁

网络拥塞往往是由许多因素引起的:

1.点缓存的容量太小;

2.链路的容量不足;

3.处理机处理的速率太慢;

4.拥塞本身会进一步加剧拥塞;

拥塞控制的一般原理

1.拥塞控制的前提:网络能够承受现有的网络负荷。

2.实践证明,拥塞控制是很难设计的,因为它是一个动态问题

3.分组的丢失是网络发生拥塞的征兆而不是原因。

4.在许多情况下,甚至正是拥塞控制本身成为引起网络性能恶化、甚至发生死锁的原因。

开环控制和闭环控制

监测网络的拥塞

主要指标有:

1.由于缺少缓存空间而被丢弃的分组的百分数;

2.平均队列长度;

3.超时重传的分组数;

4.平均分组时延;

5.分组时延的标准差;

上述这些指标的上升都标志着拥塞的增长。

拥塞控制的算法

真正的发送窗口值 = Min (接收方窗口值,拥塞窗口值)

传输轮次:

1.发送方给接收方发送数据报文段后,接收方给发送方发发回相应的确认报文段

2.一个传输轮次所经历的时间其实就是往返时间,往返时间并非是恒定的数值

3.使用传输轮次是为了强调拥塞窗口把允许发送的报文段都连续发送出去,并收到了对已发送的最后一个报文段的确认

拥塞窗口(cwnd):

1.初始拥塞窗口值:2 种设置方法,窗口值逐渐增大。

  • 2 至 4 个最大报文段 (RFC 5681
  • 1 至 2 个最大报文段 (旧标准)

2.拥塞窗口会随网络拥塞程度,以及所使用的拥塞控制算法动态变化

3.拥塞窗口值是多少发送方就可以发送多少个数据报文段

慢开始门限(ssthresh):防止拥塞窗口增长过大引起网络拥塞。

接下来我们将以一个完整的数据传输过程来讲解慢开始和拥塞避免算法

慢开始(slow-start)

目的:用来确定网络的负载能力或拥塞程度。

算法的思路:由小到大逐渐增大拥塞窗口数值。发送方每收到一个新报文段的确认,拥塞窗口值加一,然后开始下一轮的传输。

 接下来我们将举一个具体的例子,在本例中,发送方初始拥塞窗口值为1

如上图所示发送方收到了一个确认报文,因此拥塞窗口加一

经过四个传输轮次后,拥塞窗口值等于慢开始门限值,开始拥塞避免算法

拥塞避免(congestion avoidance)
  • 思路:让拥塞窗口 cwnd 缓慢地增大,避免出现拥塞。

  • 每经过一个传输轮次,拥塞窗口加一,使拥塞窗口 cwnd 按线性规律缓慢增长。

  • 在拥塞避免阶段,具有 “加法增大” (Additive Increase) 的特点。

如图所示,每经过一次传输轮次后,拥塞窗口就会加一

如果在发送过程中出现部分报文段丢失,这必然会造成发送方对这些丢失报文段的超时重传

此时重新从慢开始算法开始,并将慢开始门限值调整为了发送拥塞时拥塞窗口的一半

当拥塞窗口值等于慢开始门限值时,开始拥塞避免算法

两个算法完整示意图

快重传和快恢复

快重传(fast retrasmit)

如上图所示:接收方发现自己接收到的报文段M4不是依序达到的报文段时,就会 向发送方再次发送重复确认报文段M3以告诉发送方发送丢失的报文段。当该行为连续发生三次以后,发送方就会立刻重传丢失的报文段M3。当接收方收到丢失的报文段M3时,发送最后接收到的报文段M6的确认报文段,以告知发送方报文段M6之前的报文段已正常接收。此时便不会造成发送方对M3的超时重传了

快恢复(fast recovery)
改进后的整体算法的示意图

习题


5.6、TCP超时重传时间的选择

如果超时重传时间RTO的值设置得比RTT0的值小很多,这可能会造成发送方未收到确认报文段时超时重传器就超时了,然后发生不必要的重传,使网络负荷增大

如果超时重传时间RTO的值设置得远大于RTT0的值,这会使重传时间推迟的太长,使网络的空闲时间增大,降低传输效率

TCP可以通过某次测量的RTT计算出一个相对合理的RTO

由于TCP下层是复杂的互联网环境,因此每次数据传输的RTT都可能不同,单次RTT计算得出的RTP可能并不准确,这会造成发送方不必要的超时重传,所以TCP会根据每次的RTT计算更新RTP

 RFC6298建议使用下式计算超时重传时间RTO

往返时间RTT的测量比较复杂

TCP超时重传的计算

总结


5.7、TCP可靠传输的实现

本节以一个具体的例子去描述TCP可靠传输的实现

不推荐的原因:发送方在收到向后收缩的通知前,可能发送了窗口中的很多数据,此时在收缩窗口不允许发送这些数据就会发送错误

比如:发送方在收到收缩通知时,已经发送了31-41的数据但未收到确认报文并且发送窗口位置也没有改变,此时将窗口调整到了31-35,就会发生错误,无法描述发送窗口的状态

因此TCP使用了三个指针P1,P2,P3分别指向相应的字节序号,通过相关计算便可确认发送窗口的状态了

发送方向接收方发送31-41的报文段,由于31报文段各种异常原因,接收方首先收到了32-33的报文段,由于该报文段落在接收窗口,所以接收方依然将其存入接收缓存中。

由于接收方只能对按序到达的报文段发送确认报文,因此接收方向发送方发送31号确认报文。当发送方收到31号的重复确认时,就知道接收方收到了未按序达到的数据。由于这是第一次重复确认,因此不会引起快重传

注意:运输层的ack表示希望收到的报文段而非数据链路层的ack

此时接收方收到了发送方发送的数据报文段31,将其存入接收缓存。接收方将31-33的数据报文段交付给应用进程,并移动三个接收窗口

现在接收方收到了37,38,40的数据报文段并发送给发送方确认报文段,虽然37,38,40落在接收窗口,但它们都是未按序到达的数据只能暂存在接收缓存中

此时发送方收到确认报文

此时发送方又发送了42-53的报文段,发送窗口数据发送 完毕。

习题

   


5.8、TCP的运输连接管理

概念

TCP的连接建立

  • TCP 建立连接的过程叫做握手

  • 握手需要在客户和服务器之间交换三个 TCP 报文段。称之为三报文握手

  • 采用三报文握手主要是为了防止已失效的连接请求报文段突然又传送到了,因而产生错误。

TCP的连接建立要解决以下三个问题

TCP使用“三报文握手”建立连接

  • TCP 连接的建立采用客户服务器方式

  • 主动发起连接建立的应用进程叫做TCP客户 (client)。

  • 被动等待连接建立的应用进程叫做TCP服务器 (server)。

握手需要在TCP客户端和服务器之间交换三个TCP报文段

如下为三次握手的过程

最初两端的TCP进程都处于关闭状态

TCP服务器首先建立传输控制块用来存储TCP连接中的一些重要信息,之后进入监听状态被动等待客户端进程的连接请求

TCP服务器进程被动发起TCP连接建立的过程称为被动动打开连接

注意:TCP客户进程也是先创建传输控制块,后建立TCP连接

当TCP客户进程向TCP服务器进程主动发送TCP连接请求报文段时,进入同步已发送状态。

TCP客户进程主动发起TCP连接建立的过程称为主动打开连接

TCP连接请求报文段首部中

  • 同步位SYN被设置为1,表明这是一个TCP连接请求报文段
  • 序号字段seq被设置了一个初始值x,作为TCP客户端进程所选择的初始序号

请注意:TCP规定SYN被设置为1的报文段不能携带数据,但要消耗掉一个序号

TCP服务器进程收到TCP连接请求报文段后,如果同意建立连接,则向TCP客户进程发送TCP连接请求确认报文段,并进入同步已接收状态

TCP连接请求确认报文段首部中

  • 同步位SYN和确认位ACK都设置为1,表明这是一个TCP连接请求确认报文段
  • 序号字段seq被设置了一个初始值y,作为TCP服务器进程所选择的初始序号
  • 确认号字段ack的值被设置成了x+1,这是对TCP客户进程所选择的初始序号(seq)的确认

请注意:这个报文段也不能携带数据,因为它是SYN被设置为1的报文段,但同样要消耗掉一个序号

TCP客户进程收到TCP连接请求确认报文段后,还要向TCP服务器进程发送一个普通的TCP确认报文段,并进入连接已建立状态

普通的TCP确认报文段首部中

  • 确认位ACK被设置为1,表明这是一个普通的TCP确认报文段
  • 序号字段seq被设置为x+1,这是因为TCP客户进程发送的第一个TCP报文段的序号为x,所以TCP客户进程发送的第二个报文段的序号为x+1
  • 确认号字段ack被设置为y+1,这是对TCP服务器进程所选择的初始序号的确认

请注意:TCP规定普通的TCP确认报文段可以携带数据,但如果不携带数据,则不消耗序号

TCP服务器进程收到该确认报文段后也进入连接已建立状态

现在,TCP双方都进入了连接已建立状态,它们可以基于已建立好的TCP连接,进行可靠的数据传输

三报文握手是否多余,我们通过一个“两报文握手”实例进行观察

当TCP客户进程发送一个TCP连接请求报文段后,该报文段由于各种原因导致在某网络节点长时间滞留,此时TCP客户进程对该报文段超时重传。

TCP服务进程正常接收新的报文段并向TCP客户进程发送TCP确认报文段,之后进入连接已建立状态。

TCP客户进程收到TCP确认报文段后进入TCP连接已建立状态。

此时客户进程和服务器进程可以进行数据传输,之后通过四报文挥手释放连接并进入关闭状态。

一段时间以后,原本滞留的TCP连接请求报文段到达TCP服务器进程,TCP服务器进程会错误的再次进入连接已建立状态并向TCP客户进程发送TCP确认报文段,但TCP客户进程并不理睬,因此这必然造成服务器进程的资源浪费

因此三报文握手是为了防止已失效的连接请求报文段突然又传送到了TCP服务器,因而导致错误

习题

总结

TCP的连接释放

  • TCP 连接释放过程比较复杂。

  • 数据传输结束后,通信的双方都可释放连接。

  • TCP 连接释放过程是四报文握手

TCP通过“四报文挥手”来释放连接

  • TCP 连接的建立采用客户服务器方式

  • 主动发起连接建立的应用进程叫做TCP客户 (client)。

  • 被动等待连接建立的应用进程叫做TCP服务器 (server)。

  • 任何一方都可以在数据传送结束后发出连接释放的通知

过程

现在TCP客户进程和TCP服务器进程都处于连接已建立状态

TCP客户进程的应用进程通知其主动关闭TCP连接,TCP客户进程会发送TCP连接释放报文段,并进入终止等待1状态

TCP连接释放报文段首部中

  • 终止位FIN和确认为ACK的值都被设置为1,表明这是一个TCP连接释放报文段,同时也对之前收到的报文段进行确认
  • 序号seq字段的值设置为u,它等于TCP客户进程之前已传送过的数据的最后一个字节的序号加1
  • 确认号ack字段的值设置为v,它等于TCP客户进程之前已收到的、数据的最后一个字节的序号加1

请注意:TCP规定终止位FIN等于1的报文段即使不携带数据,也要消耗掉一个序号

TCP服务器进程收到TCP连接释放报文段后,会发送一个普通的TCP确认报文段并进入关闭等待状态

普通的TCP确认报文段首部中

  • 确认位ACK的值被设置为1,表明这是一个普通的TCP确认报文段
  • 序号seq字段的值设置为v,它等于TCP服务器进程之前已传送过的数据的最后一个字节的序号加1,这也与之前收到的TCP连接释放报文段中的确认号匹配
  • 确认号ack字段的值设置为u+1,这是对TCP连接释放报文段的确认

TCP服务器进程通知高层应用进程,TCP客户进程要断开与自己的TCP连接。这时从TCP客户进程到TCP服务器进程这个方向的连接就释放了,此时TCP连接属于半关闭状态,也就是TCP客户进程已经没有数据要发送了,该状态可能持续一段时间。

但如果TCP服务器进程还有数据要发送,TCP客户进程仍要接收,也就是说从TCP服务器进程到TCP客户进程这个方向的连接并未关闭

TCP客户进程收到TCP确认报文段后就进入终止等待2状态,等待TCP服务器进程发出的TCP连接释放报文段

若使用TCP服务器进程的应用进程已经没有数据要发送了,应用进程就通知其TCP服务器进程释放连接

由于TCP连接释放是由TCP客户进程主动发起的,因此TCP服务器进程对TCP连接的释放称为被动关闭连接

TCP服务器进程发送TCP连接释放报文段并进入最后确认状态

该报文段首部中

  • 终止位FIN和确认位ACK的值都被设置为1,表明这是一个TCP连接释放报文段,同时也对之前收到的报文段进行确认
  • 序号seq字段的值为w,这是因为在半关闭状态下,TCP服务器进程可能又发送一些数据
  • 确认号ack字段的值为u+1,这是对之前收到的TCP连接释放报文段的重复确认

TCP客户进程收到TCP连接释放报文段后,必须针对该报文段发送普通的TCP确认报文段,之后进入时间等待状态

该报文段首部中

  • 确认为ACK的值被设置为1,表明这是一个普通的TCP确认报文段
  • 序号seq字段的值设置为u+1,这是因为TCP客户进程之前发送的TCP连接释放报文段虽然不携带数据,但要消耗掉一个序号
  • 确认号ack字段的值设置为w+1,这是对所收到的TCP连接释放报文段的确认

TCP服务器进程收到该报文段后就进入关闭状态,而TCP客户进程还要进过2MSL后才能进入关闭状态

2MSL时长的时间等待里,TCP客户端没有收到来自TCP服务器进程的确认报文段就说明TCP服务器收到了TCP确认报文段而没有超时重发,并且在2MSL时间后,本次连接释放而存在的报文段全部消失不再影响下一次连接释放

如果TCP客户进程没有时间等待而直接处于关闭状态,TCP服务器进程就会因为迟迟收不到确认报文段而超时重发无法进入CLOSE状态,因此时间等待很有必要

TCP保活计时器的作用

TCP双方已经建立了连接,后来TCP客户进程所在的主机突然出现了故障,此时TCP服务器进程以后就不能再收到TCP客户进程发来的数据,因此,应当有措施使TCP服务器进程不要再白白等待下去


5.9、TCP报文段的首部格式

各字段的作用

源端口和目的端口

接下来我们以一个例子演示TCP报文段源端口和目的端口的作用

如上图所示:主机中浏览器进程浏览一个网页时,首先构建一个封装有HTTP请求报文的TCP报文段并将其发送

注意:使用HTTP协议的Web服务器进程默认80端口

Web服务器收到该TCP报文段后,解封出HTTP请求报文,并根据TCP报文段首部中目的端口字段80将HTTP请求报文上交给Web服务器进程。Web服务器进程根据HTTP请求报文的内容进行相应的处理并构建HTTP相应报文,然后封装为TCP报文段进行发送

主机收到该TCP报文段后,解封出HTTP响应报文,并根据TCP报文段首部中目的端口字段49152将其上交给浏览器进程。浏览器进程对HTTP响应保温杯的内容进行解析并显示

序号、确认号和确认标志位

接下来我们以一个例子演示TCP报文段序号、确认号和确认标志位的作用

 

数据偏移、保留、窗口和校验和

注意:发送窗口的大小还取决于拥塞窗口的大小。发送窗口的大小从接收窗口和拥塞窗口中取小者 

 

同步标志位、终止标志位、复位标志位、推送标志位、紧急标志位和紧急指针

前者SYN表明这是一个TCP连接请求报文段,后者SYN表面这是TCP连接请求确认报文段

前者FIN表明这是一个TCP连接释放报文段,后者FIN表面这是TCP连接释放确认报文段

 

接收方收到紧急标志为1的报文段,会按照紧急指针的值,从报文段数据载荷部分取出紧急数据并直接上交应用进程而不必在接收缓存中排队

选项和填充

注意: 增加选项可以增加TCP的功能

相关文章:

计算机网络(五)运输层

5.1、运输层概述 概念 进程之间的通信 从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层。 当网络的边缘部分中的两个主机使用网络的核心部分的功能进行端到端的通信时…...

网络分析仪测试S参数

S参数的测试 一:S参数的定义 S参数(Scattering Parameters,散射参数)是一个表征器件在射频信号激励下的电气行为的工具,它以输入信号、输出信号为元素的矩阵来表现DUT的“传输”和“散射”效应,输入、输出…...

什么是数据仓库?

什么是数据仓库? 数据仓库(Data Warehouse,简称DW)是一种面向分析和决策的数据存储系统,它将企业中分散的、异构的数据按照一定的主题和模型进行集成和存储,为数据分析、报表生成以及商业智能(…...

.NET8.0多线程编码结合异步编码示例

1、创建一个.NET8.0控制台项目来演示多线程的应用 2、快速创建一个线程 3、多次运行程序,可以得到输出结果 这就是多线程的特点 - 当多个线程并行执行时,它们的具体执行顺序是不确定的,除非我们使用同步机制(如 lock、信号量等&am…...

使用 Charles 调试 Flutter 应用中的 Dio 网络请求

为了成功使用 Charles 抓取并调试 Flutter 应用程序通过 Dio 发起的网络请求,需遵循特定配置步骤来确保应用程序能够识别 Charles 的 SSL 证书,并正确设置代理服务器。 配置 Charles 以支持 HTTPS 请求捕获 Charles 默认会拦截 HTTP 流量;…...

老centos7 升级docker.io为docker-ce 脚本

旧的centos7 之前安装的是docker.io 由于一些原因,像docker compose 等版本变化,以及docker.io源受限等,我们要更新到docker-ce 并使用国内阿里云的源怎么处理?下面直接上脚本,upgrade-docker.sh #!/bin/bashset -e# 创建临时目录 TEMP_DIR"./tmp" mkdir -p "…...

Go Ebiten小游戏开发:贪吃蛇

贪吃蛇是一款经典的小游戏,玩法简单却充满乐趣。本文将介绍如何使用 Go 语言和 Ebiten 游戏引擎开发一个简单的贪吃蛇游戏。通过这个项目,你可以学习到游戏开发的基本流程、Ebiten 的使用方法以及如何用 Go 实现游戏逻辑。 项目简介 贪吃蛇的核心玩法是…...

c语言----------内存管理

内存管理 目录 一。作用域1.1 局部变量1.2 静态(static)局部变量1.3 全局变量1.4 静态(static)全局变量1.5 extern全局变量声明1.6 全局函数和静态函数1.7 总结 二。内存布局2.1 内存分区2.2 存储类型总结2.3内存操作函数1) memset()2) memcpy()3) memmove()4) memcmp() 2.4 堆…...

在一个sql select中作多个sum并分组

有表如下; 单独的对某一个列作sum并分组,结果如下; 对于表的第7、8行,num1都有值,num2都是null,对num2列作sum、按id分组,结果在id为4的行会显示一个null; 同时对2个列作sum&#x…...

如何修复Android上未安装的应用程序

在Android设备上安装应用程序通常是一个简单的过程。然而,“ Android上未安装应用程序”是一种常见的智能手机错误消息,由于一个或多个原因而经常遇到。发现由于即将出现故障而无法充分利用手机,这当然会非常令人沮丧,但幸运的是&…...

#CSS混合模式:解决渐变背景下的文字可见性问题

在现代网页设计中,渐变背景的使用越来越普遍。然而,当我们在渐变背景上放置文字时,常常会遇到一个问题:文字在某些背景颜色下可能变得难以阅读。今天,我们将探讨一个优雅的解决方案:使用CSS混合模式。 问题…...

微信小程序原生与 H5 交互方式

在微信小程序中,原生与 H5 页面(即 WebView 页面)之间的交互通常有以下几种方式: 1. 使用 postMessage 进行通信 微信小程序的 WebView 页面和原生小程序页面可以通过 postMessage 来进行数据传递。 WebView 页面向原生小程序发…...

kotlin中的flow使用,Flow跟生命周期结合

kotlin的Flow可以连续异步发出多个数据。 1. 普通flow,冷流类似于一个函数,当开始收集时才开始运行 val coldStream flow {for (i in 1..5) {delay(100L)emit(i)}} val collect1 buildString {coldStream.collect { append(it).append(", ") } }.remo…...

讲一下ZooKeeper的持久化机制?

大家好,我是锋哥。今天分享关于【讲一下ZooKeeper的持久化机制?】面试题。希望对大家有帮助; 讲一下ZooKeeper的持久化机制? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 ZooKeeper 是一个开源的分布式协调服务&…...

mybatis里面实现动态升降序

问题 最近有一个需求&#xff0c;需要前端告诉后端按照某个字段进行排序。这里主要侧重mybatis的xml实现&#xff0c;其他Spring集成就忽略了。 mapper xml实现 <if test"sortField ! null and sortField ! ">ORDER BY<choose><when test"sor…...

探索网络安全:浅析文件上传漏洞

前言 在数字化时代&#xff0c;网络安全已成为我们每个人都需要关注的重要议题。无论是个人隐私保护&#xff0c;还是企业数据安全&#xff0c;网络威胁无处不在。了解网络安全的基本知识和防护措施&#xff0c;对我们每个人来说都至关重要。 网络安全 网络安全并非只是对网…...

【C++】B2112 石头剪子布

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述游戏规则&#xff1a;输入格式&#xff1a;输出格式&#xff1a;输入输出样例&#xff1a;解题分析与实现 &#x1f4af;我的做法实现逻辑优点与不足 &#x1f4af…...

java根据模板导出word,并在word中插入echarts相关统计图片以及表格

引入依赖创建word模板创建ftl模板文件保存的ftl可能会出现占位符分割的问题&#xff0c;需要处理将ftl文件中的图片的Base64删除&#xff0c;并使用占位符代替插入表格&#xff0c;并指定表格的位置在图片下方 Echarts转图片根据模板生成word文档DocUtil导出word文档 生成的wor…...

Linux网络知识——路由表

路由表 1 定义与作用 Linux路由表是一个内核数据结构&#xff0c;用于描述Linux主机与其他网络设备之间的路径&#xff0c;以及如何将数据包从源地址路由到目标地址。路由表的主要作用是指导数据包在网络中的传输路径&#xff0c;确保数据包能够准确、高效地到达目标地址。 …...

ImageSharp图形库学习

一、引言 在当今数字化时代&#xff0c;无论是 Web 应用、桌面程序&#xff0c;还是移动应用&#xff0c;图像处理都扮演着至关重要的角色。从电商平台展示商品图片&#xff0c;到社交媒体分享照片&#xff0c;再到各种软件的图标设计&#xff0c;图像处理无处不在。博主们在内…...

Android string.xml中特殊字符转义

项目中要在string.xml 中显示特殊符号 空格&#xff1a; &#xff08;普通的英文半角空格但不换行&#xff09; 窄空格&#xff1a;  &#xff08;中文全角空格 &#xff08;一个中文宽度&#xff09;&#xff09; &#xff08;半个中文宽度&#xff0c;但两个空格比一个中文…...

Rust 游戏开发框架指南

Rust 游戏开发框架指南 主流游戏引擎 1. Bevy 最受欢迎的 Rust 游戏引擎之一&#xff0c;基于 ECS&#xff08;实体组件系统&#xff09;架构。 特点&#xff1a; &#x1f680; 高性能 ECS 系统&#x1f4e6; 热重载支持&#x1f3a8; 现代渲染器&#x1f50a; 内置音频系…...

SpringBoot3+Vue3开发台球计时系统

项目介绍 台球计时系统可以帮助我们自动计算开台时间&#xff08;从开始到结束的时间段&#xff09;、自动计算开台费用、结账后生成订单记录进行留存、也可以导出订单记录。 主要功能包含&#xff1a;球桌管理、开台、结账、查看占用明细、查看球台订单、订单管理、查看订单…...

基于springboot的租房网站系统

作者&#xff1a;学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等 文末获取“源码数据库万字文档PPT”&#xff0c;支持远程部署调试、运行安装。 项目包含&#xff1a; 完整源码数据库功能演示视频万字文档PPT 项目编码&#xff1…...

静态综合路由实验

实验拓扑 实验要求 1.除R5的环回地址外&#xff0c;整个其他所有网段基于192.168.1.0/24进行合理的IP地址划分 2.R1-R4每个路由器存在两个环回接口&#xff0c;用于模拟pc网段&#xff1b;地址也在192.168.1.0/24这个网络范围内 3.R1-R4上不能直接编写到达5.5.5.0/24的静态路由…...

国产编辑器EverEdit - 扩展脚本:新建同类型文件(避免编程学习者反复新建保存练习文件)

1 扩展脚本&#xff1a;在当前文件目录下新建同类型文件 1.1 应用场景 用户在进行编程语言学习时&#xff0c;比如&#xff1a;Python&#xff0c;经常做完一个小练习后&#xff0c;又需要新建一个文件&#xff0c;在新建文件的时候&#xff0c;不但要选择文件类型&#xff0c…...

Ubuntu Server 24.04 配置静态IP

Ubuntu Server 24.04 配置静态IP 提示&#xff1a;基于Ubuntu Server 24.04进行配置 文章目录 Ubuntu Server 24.04 配置静态IP一、查看网卡信息二、修改网卡信息三、使网卡配置生效四、测试 一、查看网卡信息 使用命令 ip a lo 为本地回环地址 ens33 真实网卡地址 shanfengubu…...

​​​​​​​​​​​​​​★3.3 事件处理

★3.3.1 ※MouseArea Item <-- MouseArea 属性 acceptedButtons : Qt::MouseButtons containsMouse : bool 【书】只读属性。表明当前鼠标光标是否在MouseArea上&#xff0c;默认只有鼠标的一个按钮处于按下状态时才可以被检测到。 containsPress : bool curs…...

linux系统监视(centos 7)

一.系统监视 1.安装iostat&#xff0c;sar&#xff0c;sysstat&#xff08;默认没有&#xff0c;安装过可以跳跃&#xff09; iostat 和 sar&#xff1a; 同样&#xff0c;iostat 和 sar 是 sysstat 软件包的一部分。使用以下命令安装&#xff1a;sudo yum install sysstat解释…...

Java面试总结(1)

问题1 自我介绍&#xff1a; 面试官您好&#xff0c;我叫xxx&#xff0c;是来自xxxx大学软件工程专业的一名应届生&#xff0c;我这次想应聘的是java开发实习生&#xff0c;在校期间&#xff0c;我热爱编程&#xff0c;能够使用java&#xff0c;C,python的编程语言&#xff0c…...

晨辉面试抽签和评分管理系统之六:面试答题倒计时

晨辉面试抽签和评分管理系统&#xff08;下载地址:www.chenhuisoft.cn&#xff09;是公务员招录面试、教师资格考试面试、企业招录面试等各类面试通用的考生编排、考生入场抽签、候考室倒计时管理、面试考官抽签、面试评分记录和成绩核算的面试全流程信息化管理软件。提供了考生…...

关于H5复制ios没有效果

问题场景&#xff1a;今天遇到这样一个问题&#xff0c;需要从后端接口获取到的值进行复制&#xff0c;且不能提现调用获取值&#xff0c;因为是一个数据列表&#xff0c;每个列表元素需要当场点击调用接口获取值进行复制&#xff0c;本来以为很简单的一个需求&#xff0c;当做…...

Windows 蓝牙驱动开发-安装蓝牙设备

蓝牙配置文件驱动程序有两种安装类型&#xff1a; 客户端安装&#xff0c;在此类安装中&#xff0c;远程设备播发其服务&#xff0c;并且计算机与之连接。 示例包括&#xff1a;鼠标、键盘和打印机&#xff1b;服务器端安装&#xff0c;在此类安装中&#xff0c;计算机播发服务…...

你喜欢用什么编辑器?

电脑工作者和程序员所使用的文本编辑器通常需要具备高效率、易用性以及对代码友好等特点&#xff0c;包括语法高亮、自动完成、多文件同时编辑、查找替换、版本控制集成等功能。以下是几个广受开发者欢迎且实用性较强的文本编辑器&#xff1a; Visual Studio Code&#xff08;V…...

32_Redis分片集群原理

1.Redis集群分片 1.1 Redis集群分片介绍 Redis集群没有使用一致性hash,而是引入了哈希槽的概念。Redis集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽。 用于将密钥映射到散列插槽的基本算法如下: HASH_SLOT = CRC16(key) mod 16384 集群的每…...

小米vela系统(基于开源nuttx内核)——openvela开源项目

前言 在 2024 年 12 月 27 日的小米「人车家全生态」合作伙伴大会上&#xff0c;小米宣布全面开源 Vela 操作系统。同时&#xff0c;OpenVela 项目正式上线 GitHub 和 Gitee&#xff0c;采用的是比较宽松的 Apache 2.0 协议&#xff0c;这意味着全球的开发者都可以参与到 Vela…...

【STM32-学习笔记-7-】USART串口通信

文章目录 USART串口通信Ⅰ、硬件电路Ⅱ、常见的电平标准Ⅲ、串口参数及时序Ⅳ、STM32的USART简介数据帧起始位侦测数据采样波特率发生器 Ⅴ、USART函数介绍Ⅵ、USART_InitTypeDef结构体参数1、USART_BaudRate2、USART_WordLength3、USART_StopBits4、USART_Parity5、USART_Mode…...

实现类似Excel的筛选

以下是在 DataGridView 中实现类似 Excel 下拉筛选功能的解决方案&#xff1a; 解决思路 为 DataGridView 的列添加 DataGridViewComboBoxColumn 类型的列&#xff0c;用于显示下拉筛选列表。为 DataGridView 的 ColumnHeaderMouseClick 事件添加处理程序&#xff0c;当用户点…...

【Rust】结构体定义域实例化

目录 思维导图 1. 结构体的定义与实例化 1.1 结构体的基本概念 1.2 定义结构体 1.3 创建结构体实例 1.4 结构体的定义与实例化示例 2. 访问与修改结构体字段 2.1 访问字段 2.2 修改字段 3. 结构体实例的构造函数 3.1 构造函数的定义 3.2 使用字段初始化简写 4. 结…...

VB.NET 正则表达式完全指南

VB.NET 正则表达式完全指南 VB.NET通过 System.Text.RegularExpressions 命名空间提供正则表达式支持。本指南将详细介绍VB.NET中正则表达式的使用方法、性能优化和最佳实践。 1. 基础知识 1.1 导入命名空间 Imports System.Text.RegularExpressions1.2 基本使用 Public C…...

ASP.NET Core - 配置系统之自定义配置提供程序

ASP.NET Core - 配置系统之自定义配置提供程序 4. 自定义配置提供程序IConfigurationSourceIConfigurationProvider 4. 自定义配置提供程序 在 .NET Core 配置系统中封装一个配置提供程序关键在于提供相应的 IconfigurationSource 实现和 IConfigurationProvider 接口实现&…...

大语言模型的稀疏性:提升效率与性能的新方向

大语言模型的稀疏性&#xff1a;提升效率与性能的新方向 大语言模型&#xff08;LLM, Large Language Model&#xff09;随着参数规模的不断扩大&#xff0c;其性能得到了显著提升&#xff0c;但也带来了巨大的计算和存储开销。稀疏性&#xff08;Sparsity&#xff09;作为一种…...

迅为RK3568开发板篇OpenHarmony配置HDF驱动控制LED-新增 topeet子系统-编写 bundle.json文件

bundle.json 文件内容如下所示&#xff1a; 下面是对各个字段的解释&#xff1a; 1. name: "ohos/demos" - 这是组件或项目的名称&#xff0c;这里表示它属于 OHOS&#xff08;OpenHarmony OS&#xff09;生态系统下的一个名为"demos"的组件。 2. descri…...

vulnhub靶场【IA系列】之Tornado

前言 靶机&#xff1a;IA-Tornado&#xff0c;IP地址为192.168.10.11 攻击&#xff1a;kali&#xff0c;IP地址为192.168.10.2 都采用虚拟机&#xff0c;网卡为桥接模式 本文所用靶场、kali镜像以及相关工具&#xff0c;我放置在网盘中&#xff0c;可以复制后面链接查看 htt…...

GB44495-2024 汽车整车信息安全技术要求 - V2X部分前置要求

背景 GB 44495-2024《汽车整车信息安全技术要求》中关于V2X&#xff08;车与外界通信&#xff09;的部分&#xff0c;主要关注于通信安全要求&#xff0c;旨在确保车辆在与外部设备进行数据交互时的信息安全。其测试大致可分为消息层&#xff08;数据无异常&#xff09;、应用…...

基于mediapipe的手势游戏控制

基于mediapipe的手势游戏控制 ​ 玩游戏&#xff0c;那不是有手就行!!! mediapipe介绍 ​ Mediapipe是Google在2019年开发并提出的一款开源的跨平台多媒体处理框架&#xff0c;用于构建基于机器学习的应用程序&#xff0c;特别是涉及到计算机视觉、音频处理、姿势估计等领域。…...

K8S 节点选择器

今天我们来实验 pod 调度的 nodeName 与 nodeSelector。官网描述如下&#xff1a; 假设有如下三个节点的 K8S 集群&#xff1a; k8s31master 是控制节点 k8s31node1、k8s31node2 是工作节点 容器运行时是 containerd 一、镜像准备 1.1、镜像拉取 docker pull tomcat:8.5-jre8…...

IEC103 转 ModbusTCP 网关

一、产品概述 IEC103 转 ModbusTCP 网关型号 SG-TCP-IEC103 &#xff0c;是三格电子推出的工业级网关&#xff08;以下简 称网关&#xff09;&#xff0c;主要用于 IEC103 数据采集、 DLT645-1997/2007 数据采集&#xff0c; IEC103 支持遥测和遥 信&#xff0c;可接…...

docker swarm 部署问题 和 指定节点部署服务

问题原因&#xff1a; docker swarm 部署遇到的问题&#xff0c; 先前docker compose部署&#xff0c;分别创建了 cloud 网络&#xff1b; 昨进行swarm 集群部署&#xff1b;只是删了57 机器cloud 网络&#xff1b;在创建swarm集群后创建cloud 58机器 没有删除先前的cloud 网络…...

09.VSCODE:安装 Git for Windows

在 Windows 下安装著名的源代码管理工具&#xff1a;git。 git 工具两大作用&#xff1a; 管理我们自己的源代码获取他人&#xff08;开源的&#xff09;源代码 当前我们更需要第2点。 为什么要安装 git 一、 得到更多库 之前课程中我们安装了 msys2&#xff0c;从而可以通…...