浅谈网络是怎样连接的(二)

2.1创建套接字

2.1.1协议栈的内部结构

​ TCP/IP软件采用分层结构
在这里插入图片描述

协议栈的上半部分有两块,分别是负责用TCP协议收发数据的部分和负责用UDP协议收发数据的部分

在互联网上传送数据时,数据会被切分成一个一个的网络包,而将网络包发送给通信对象的操作就是由IP来负责的

ICMP用于告知网络包传送过程中产生的错误以及各种控制消息,ARP用于根据IP地址查询相应的以太网MAC地址

IP下面的网卡驱动程序负责控制网卡硬件,而最下面的网卡则负责完成实际的收发操作,也就是对网线中的信号执行发送和接收的操作。

2.2.2 负责保存控制信息的头部
  • 第一类是客户端和服务器相互联络时交换的控制信息。这些信息不仅连接时需要,包括数据收发和断开连接操作在内

TCP头部格式
在这里插入图片描述

  • 另外一类,那就是保存在套接字中,用来控制协议栈操作的信息

客户端与服务器之间交换的控制信息
在这里插入图片描述

通信操作中使用的控制信息分为两类:

  1. 头部中记录的信息
  2. 套接字(协议栈中的内存空间)中记录的信息

2.3 收发数据

2.3.1 讲HTTP请求交给协议栈

​ 协议栈并不是一收到数据就马上发送出去,而是会将数据存放在内部的发送缓冲区中,并等待应用程序的下一段数据

​ 同时,积累多少数据才能发送,不同种类和版本的操作系统会有所不同,不能一概而论。

​ 收发数据积累量由以下要素决定:

  • 第一个判断要素是每个网络包能容纳的数据长度,协议栈会根据一个叫作MTU[插图]的参数来进行判断。MTU表示一个网络包的最大长度,在以太网中一般是1500字节(图2.5)

    MTU是包含头部的总长度,因此需要从MTU减去头部的长度,然后得到的长度就是一个网络包中所能容纳的最大数据长度,这一长度叫作MSS

    MTU:一个网络包的最大长度,以太网中一般为1500字节。

    MSS:除去头部之后,一个网络包所能容纳的TCP数据的最大长度。

  • 时间:当应用程序发送数据的频率不高的时候,如果每次都等到长度接近MSS时再发送,可能会因为等待时间太长而造成发送延迟,这种情况下,即便缓冲区中的数据长度没有达到MSS,也应该果断发送出去。为此,协议栈的内部有一个计时器,当经过一定时间之后,就会把网络包发送出去

  • 两者的平衡由协议栈的开发者决定的

MTU与MSS

在这里插入图片描述

2.3.2 对较大数据拆分

在这里插入图片描述

2.3.3 使用ACK号确认网络包已收到

序号和ACK的用法
在这里插入图片描述

数据双向传输
在这里插入图片描述

序号和ACK号的交互
在这里插入图片描述

2.3.4 根据网络包平均往返时间调整ACK号等待时间

​ TCP采用了动态调整等待时间的方法,这个等待时间是根据ACK号返回所需的时间来判断的。具体来说,TCP会在发送数据的过程中持续测量ACK号的返回时间,如果ACK号返回变慢,则相应延长等待时间;相对地,如果ACK号马上就能返回,则相应缩短等待时间

2.3.5 使用窗口有效管理ACK号

一来一回方式和滑动窗口方式
在这里插入图片描述

滑动窗口与接收缓冲区
在这里插入图片描述

2.3.6 ACK与窗口的合并

​ 在等待发送ACK号的时候正好需要更新窗口,这时就可以把ACK号和窗口更新放在一个包里发送,从而减少包的数量。当需要连续发送多个ACK号时,也可以减少包的数量,这是因为ACK号表示的是已收到的数据量,也就是说,它是告诉发送方目前已接收的数据的最后位置在哪里,因此当需要连续发送ACK号时,只要发送最后一个ACK号就可以了,中间的可以全部省略。当需要连续发送多个窗口更新时也可以减少包的数量,因为连续发生窗口更新说明应用程序连续请求了数据,接收缓冲区的剩余空间连续增加。这种情况和ACK号一样,可以省略中间过程,只要发送最终的结果就可以了。

2.3.7 接受HTTP响应消息

​ 首先,协议栈会检查收到的数据块和TCP头部的内容,判断是否有数据丢失,如果没有问题则返回ACK号。然后,协议栈将数据块暂存到接收缓冲区中,并将数据块按顺序连接起来还原出原始的数据,最后将数据交给应用程序。具体来说,协议栈会将接收到的数据复制到应用程序指定的内存地址中,然后将控制流程交回应用程序。将数据交给应用程序之后,协议栈还需要找到合适的时机向发送方发送窗口更新[插图]。

2.4 从服务器断开并删除套接字

2.4.1 数据发送弯臂后断开连接

断开的交互过程

[外在这里插入图片描述

2.4.2 删除套接字

​ 和服务器的通信结束之后,用来通信的套接字也就不会再使用了,这时我们就可以删除这个套接字了。不过,套接字并不会立即被删除,而是会等待一段时间之后再被删除

​ 如果最后客户端返回的ACK号丢失了,结果会如何呢?这时,服务器没有接收到ACK号,可能会重发一次FIN。如果这时客户端的套接字已经删除了,会发生什么事呢?套接字被删除,那么套接字中保存的控制信息也就跟着消失了,套接字对应的端口号就会被释放出来。这时,如果别的应用程序要创建套接字,新套接字碰巧又被分配了同一个端口号[插图],而服务器重发的FIN正好到达,会怎么样呢?本来这个FIN是要发给刚刚删除的那个套接字的,但新套接字具有相同的端口号,于是这个FIN就会错误地跑到新套接字里面,新套接字就开始执行断开操作了。之所以不马上删除套接字,就是为了防止这样的误操作。

2.4.3 数据收发操作小节

TCP的整体流程
在这里插入图片描述

​ Web为例,首先客户端会向服务器发送请求消息。TCP会将请求消息切分成一定大小的块,并在每一块前面加上TCP头部,然后发送给服务器(图2.13④)。TCP头部中包含序号,它表示当前发送的是第几个字节的数据。当服务器收到数据时,会向客户端返回ACK号(图2.13⑤)。

​ 在最初的阶段,服务器只是不断接收数据,随着数据收发的进行,数据不断传递给应用程序,接收缓冲区就会被逐步释放。这时,服务器需要将新的窗口大小告知客户端。当服务器收到客户端的请求消息后,会向客户端返回响应消息,这个过程和刚才的过程正好相反)。

​ 服务器的响应消息发送完毕之后,数据收发操作就结束了,这时就会开始执行断开操作。以Web为例,服务器会先发起断开过程[插图]。在这个过程中,服务器先发送一个FIN为1的TCP包(图2.13⑧),然后客户端返回一个表示确认收到的ACK号(图2.13⑨)。接下来,双方还会交换一组方向相反的FIN为1的TCP包(图2.13⑩)和包含ACK号的TCP包(图2.13⑪)。最后,在等待一段时间后,套接字会被删除

2.5 IP与以太网的包收发操作

2.5.1 包的基本知识

​ TCP模块在执行连接、收发、断开等各阶段操作时,都需要委托IP模块将数据封装成包发送给通信对象

​ 包是由头部和数据两部分构成的,头部包含目的地址等控制信息,头部后面就是委托方要发送给对方的数据

​ 首先,发送方的网络设备会负责创建包,创建包的过程就是生成含有正确控制信息的头部,然后再附加上要发送的数据。接下来,包会被发往最近的网络转发设备。当到达最近的转发设备之后,转发设备会根据头部中的信息判断接下来应该发往哪里。这个过程需要用到一张表,这张表里面记录了每一个地址对应的发送方向,也就是按照头部里记录的目的地址在表里进行查询,并根据查到的信息判断接下来应该发往哪个方向。比如,如果查表的结果是“目标地址为××××的包应该发到××××号线路”,那么转发设备就会把这个包发到××××号线路去。接下来,包在向目的地移动的过程中,又会到达下一个转发设备,然后又会按照同样的方式被发往下一个转发设备。就这样,经过多个转发设备的接力之后,包最终就会到达接收方的网络设备。当然,发送方向接收方发送一个包,接收方可能也会向发送方返回一个包,此时的发送方到了接下来的某个时刻就会变成接收方。因此,我们不需要把发送方和接收方明确区分开来,在这里我们把发送方和接收方统称为终端节点

网络包结构
在这里插入图片描述

发送方接收方和转发设备
在这里插入图片描述

(1)路由器根据目标地址判断下一个路由器的位置

(2)集线器在子网中将网络包传输到下一个路由

集线器是按照以太网规则传输包的设备,而路由器是按照IP规则传输包的设备

(1)IP协议根据目标地址判断下一个IP转发设备的位置

(2)子网中的以太网协议将包传输到下一个转发设备

TCP/IP包

(a)MAC头部(用于以太网协议)

(b)IP头部(用于IP协议)

​ 这两个头部分别具有不同的作用。首先,发送方将包的目的地,也就是要访问的服务器的IP地址写入IP头部中。这样一来,我们就知道这个包应该发往哪里,IP协议就可以根据这一地址查找包的传输方向,从而找到下一个路由器的位置,也就是图2.16中的路由器R1。接下来,IP协议会委托以太网协议将包传输过去。这时,IP协议会查找下一个路由器的以太网地址(MAC地址),并将这个地址写入MAC头部中。这样一来,以太网协议就知道要将这个包发到哪一个路由器上了。

​ 网络包在传输过程中(图2.16①)会经过集线器,集线器是根据以太网协议工作的设备。为了判断包接下来应该向什么地方传输,集线器里有一张表(用于以太网协议的表),可根据以太网头部中记录的目的地信息查出相应的传输方向。这张图中只有一个集线器,当存在多个集线器时,网络包会按顺序逐一通过这些集线器进行传输。

​ 接下来,包会到达下一个路由器(图2.16②)。路由器中有一张IP协议的表,可根据这张表以及IP头部中记录的目的地信息查出接下来应该发往哪个路由器。为了将包发到下一个路由器,我们还需要查出下一个路由器的MAC地址,并记录到MAC头部中,大家可以理解为改写了MAC头部[插图]。这样,网络包就又被发往下一个节点了。

IP网络包的传输格式
在这里插入图片描述

2.5.2 包收发概览

​ 包收发操作的起点是TCP模块委托IP模块发送包的操作(图2.17中的“①发送”)。这个委托的过程就是TCP模块在数据块的前面加上TCP头部,然后整个传递给IP模块,这部分就是网络包的内容。与此同时,TCP模块还需要指定通信对象的IP地址,也就是需要写清楚“将什么内容发给谁”。

​ IP模块会添加IP头部和MAC头部这两种头部

​ IP头部中包含IP协议规定的、根据IP地址将包发往目的地所需的控制信息;MAC头部包含通过以太网的局域网将包传输至最近的路由器所需的控制信息

​ 传递给网卡的网络包是由一连串0和1组成的数字信息,网卡会将这些数字信息转换为电信号或光信号,并通过网线(或光纤)发送出去,然后这些信号就会到达集线器、路由器等转发设备,再由转发设备一步一步地送达接收方。

​ 信息先以电信号的形式从网线传输进来,然后由网卡将其转换为数字信息并传递给IP模块(图2.17中的“③接收”)

无论要收发的包是控制包还是数据包,IP对各种类型的包的收发操作都是相同的。

2.5.3 生成包含接受方IP地址的头部

​ 其中最重要的内容就是IP地址,它表示这个包应该发到哪里去。这个地址是由TCP模块告知的,而TCP又是在执行连接操作时从应用程序那里获得这个地址的,因此这个地址的最初来源就是应用程序

IP头部格式
在这里插入图片描述

  • IP头部的“接收方IP地址”填写通信对象的IP地址。

  • 发送方IP地址需要判断发送所使用的网卡,并填写该网卡的IP地址。

​ 如图2.18所示,我们可以通过route print命令来显示路由表,下面来边看边讲。首先,我们对套接字中记录的目的地IP地址与路由表左侧的Network Destination栏进行比较,找到对应的一行。例如,TCP模块告知的目标IP地址为192.168.1.21,那么就对应图2.18中的第6行,因为它和192.168.1的部分相匹配。如果目标IP地址为10.10.1.166,那么就和10.10.1的部分相匹配,所以对应第3行。以此类推,我们需要找到与IP地址左边部分相匹配的条目[插图],找到相应的条目之后,接下来看从右边数第2列和第3列的内容。右起第2列,也就是Interface列,表示网卡等网络接口,这些网络接口可以将包发送给通信对象。此外,右起第3列,即Gateway列表示下一个路由器的IP地址,将包发给这个IP地址,该地址对应的路由器[插图]就会将包转发到目标地址[插图]。路由表的第1行中,目标地址和子网掩码[插图]都是0.0.0.0,这表示默认网关,如果其他所有条目都无法匹配,就会自动匹配这一行[插图]

2.5.4 生成以太网用的MAC头部

​ 以太网在判断网络包目的地时和TCP/IP的方式不同,因此必须采用相匹配的方式才能在以太网中将包发往目的地,而MAC头部就是干这个用的。

​ MAC地址为48比特

​ 协议号表示IP头部后面的包内容的类型;而在以太网中,我们可以认为以太网类型后面就是以太网包的内容,而以太类型就表示后面内容的类型。以太网包的内容可以是IP、ARP等协议的包,它们都有对应的值,这也是根据规则来确定的

MAC头部的字段
在这里插入图片描述

​ 前面这些还比较简单,而接收方MAC地址就有点复杂了。只要告诉以太网对方的MAC的地址,以太网就会帮我们把包发送过去,那么很显然这里应该填写对方的MAC地址。然而,在这个时间点上,我们还没有把包发送出去,所以先得搞清楚应该把包发给谁,这个只要查一下路由表就知道了。在路由表中找到相匹配的条目,然后把包发给Gateway列中的IP地址就可以了

​ IP模块根据路由表Gateway栏的内容判断应该把包发送给谁。

​ 我们现在根本不知道对方的MAC地址是什么。因此,我们还需要执行根据IP地址查询MAC地址的操作。

2.5.5 通过ARP查询目标路由器的MAC地址

​ 这里我们需要使用ARP[插图],它其实非常简单。在以太网中,有一种叫作广播的方法,可以把包发给连接在同一以太网中的所有设备。ARP就是利用广播对所有设备提问:“××这个IP地址是谁的?请把你的MAC地址告诉我。”然后就会有人回答:“这个IP地址是我的,我的MAC地址是××××。
在这里插入图片描述

用ARP查询MAC地址

​ 如果每次发送包都要这样查询一次,网络中就会增加很多ARP包,因此我们会将查询结果放到一块叫作ARP缓存的内存空间中留着以后用。

ARP缓存的内容
在这里插入图片描述

MAC地址
在这里插入图片描述

​ 有了ARP缓存,我们可以减少ARP包的数量,但如果总是使用ARP缓存中保存的地址也会产生问题。例如当IP地址发生变化时,ARP缓存的内容就会和现实发生差异。为了防止这种问题的发生,ARP缓存中的值在经过一段时间后会被删除,一般这个时间在几分钟左右。这个删除的操作非常简单粗暴,不管ARP缓存中的内容是否有效,只要经过几分钟就全部删掉,这样就不会出问题了。当地址从ARP缓存中删除后,只要重新执行一次ARP查询就可以再次获得地址了。

查询MAC地址需要使用ARP。

2.5.6 以太网的基本知识

​ 以太网是一种为多台计算机能够彼此自由和廉价地相互通信而设计的通信技术

以太网的基本结构
在这里插入图片描述

​ 尽管以太网经历了数次变迁,但其基本的3个性质至今仍未改变,

  • 即将包发送到MAC头部的接收方MAC地址代表的目的地

  • 用发送方MAC地址识别发送方

  • 用以太类型识别包的内容。

    因此,大家可以认为具备这3个性质的网络就是以太网

2.5.7 讲IP包转换成店或者光信号进行传输

​ 尽管以太网经历了数次变迁,但其基本的3个性质至今仍未改变,即将包发送到MAC头部的接收方MAC地址代表的目的地,用发送方MAC地址识别发送方,用以太类型识别包的内容。因此,大家可以认为具备这3个性质的网络就是以太网

​ 负责执行这一操作的是网卡,但网卡也无法单独工作,要控制网卡还需要网卡驱动程序。

​ 网卡并不是通上电之后就可以马上开始工作的,而是和其他硬件一样,都需要进行初始化。也就是说,打开计算机启动操作系统的时候,网卡驱动程序会对硬件进行初始化操作,然后硬件才进入可以使用的状态。这些操作包括硬件错误检查、初始设置等步骤,这些步骤对于很多其他硬件也是共通的,但也有一些操作是以太网特有的,那就是在控制以太网收发操作的MAC[插图]模块中设置MAC地址

网卡
在这里插入图片描述

网卡的ROM中保存着全世界唯一的MAC地址,这是在生产网卡时写入的。

网卡中保存的MAC地址会由网卡驱动程序读取并分配给MAC模块。

2.5.8 给网络再加3个控制数据

​ 网卡驱动从IP模块获取包之后,会将其复制到网卡内的缓冲区中,然后向MAC模块发送发送包的命令。

​ MAC模块会将包从缓冲区中取出,并在开头加上报头和起始帧分界符,在末尾加上用于检测错误的帧校验序列

网卡发送出去的网络包
在这里插入图片描述

​ MAC头部很容易被误解为是由网卡来处理的,实际上它是由TCP/IP软件来负责的

​ 报头是一串像10101010…这样1和0交替出现的比特序列,长度为56比特,它的作用是确定包的读取时机

报头和起始桢分界符
在这里插入图片描述

每个包的前面都有报头和起始帧分界符(SFD),报头用来测定时机,SFD用来确定帧的起始位置。

通过时钟测量读取信号的时机
在这里插入图片描述

​ 当距离较远,网线较长时,两条线路的长度会发生差异,数据信号和时钟信号的传输会产生时间差,时钟就会发生偏移。

​ 因此,我们不能一开始就发送包的数据,而是要在前面加上一段用来测量时钟信号的特殊信号,这就是报头的作用

​ 末尾的FCS(帧校验序列)用来检查包传输过程中因噪声导致的波形紊乱、数据错误,它是一串32比特的序列,是通过一个公式对包中从头到尾的所有内容进行计算而得出来的

2.5.9 向集线器发送网络包

​ 在半双工模式中,为了避免信号碰撞,首先要判断网线中是否存在其他设备发送的信号。如果有,则需要等待该信号传输完毕,因为如果在有信号时再发送一组信号,两组信号就会发生碰撞。当之前的信号传输完毕,或者本来就没有信号在传输的情况下,我们就可以开始发送信号了。首先,MAC模块从报头开始将数字信息按每个比特转换成电信号,然后由PHY,或者叫MAU的信号收发模块发送出去[插图]。在这里,将数字信息转换为电信号的速率就是网络的传输速率,例如每秒将10Mbit的数字信息转换为电信号发送出去,则速率就是10 Mbit/s。

​ 接下来,PHY(MAU)模块会将信号转换为可在网线上传输的格式,并通过网线发送出去。以太网规格中对不同的网线类型和速率以及其对应的信号格式进行了规定,但MAC模块并不关心这些区别,而是将可转换为任意格式的通用信号发送给PHY(MAU)模块,然后PHY(MAU)模块再将其转换为可在网线上传输的格式。大家可以认为PHY(MAU)模块的功能就是对MAC模块产生的信号进行格式转换

举例:
在这里插入图片描述

网卡的MAC模块生成通用信号,然后由PHY(MAU)模块转换成可在网线中传输的格式,并通过网线发送出去。

​ 根据以太网的规格,两台设备之间的网线不能超过100米,在这个距离内极少会发生错误,万一[插图]发生错误,协议栈的TCP也会负责搞定,因此在发送信号时没有必要检查错误。

​ 在使用集线器的半双工模式中,一旦发生这种情况,两组信号就会相互叠加,无法彼此区分出来,这就是所谓的信号碰撞。这种情况下,继续发送信号是没有意义的,因此发送操作会终止。为了通知其他设备当前线路已发生碰撞,还会发送一段时间的阻塞信号[插图],然后所有的发送操作会全部停止。

​ 等待一段时间之后,网络中的设备会尝试重新发送信号。但如果所有设备的等待时间都相同,那肯定还会发生碰撞,因此必须让等待的时间相互错开。具体来说,等待时间是根据MAC地址生成一个随机数计算出来的。

​ 当网络拥塞时,发生碰撞的可能性就会提高,重试发送的时候可能又会和另外一台设备的发送操作冲突,这时会将等待时间延长一倍,然后再次重试。以此类推,每次发生碰撞就将等待时间延长一倍,最多重试10次,如果还是不行就报告通信错误。

2.5.10 接收返回包

​ 信号的开头是报头,通过报头的波形同步时钟,然后遇到起始帧分界符时开始将后面的信号转换成数字信息。这个操作和发送时是相反的,即PHY(MAU)模块先开始工作,然后再轮到MAC模块。首先,PHY (MAU)模块会将信号转换成通用格式并发送给MAC模块,MAC模块再从头开始将信号转换为数字信息,并存放到缓冲区中。当到达信号的末尾时,还需要检查FCS。具体来说,就是将从包开头到结尾的所有比特套用到公式中计算出FCS,然后和包末尾的FCS进行对比,正常情况下两者应该是一致的,如果中途受到噪声干扰而导致波形发生紊乱,则两者的值会产生差异,这时这个包就会被当作错误包而被丢弃。

​ 具体来说,中断的工作过程是这样的。首先,网卡向扩展总线中的中断信号线发送信号,该信号线通过计算机中的中断控制器连接到CPU。当产生中断信号时,CPU会暂时挂起正在处理的任务,切换到操作系统中的中断处理程序[插图]。然后,中断处理程序会调用网卡驱动,控制网卡执行相应的接收操作

​ 网卡驱动被中断处理程序调用后,会从网卡的缓冲区中取出收到的包,并通过MAC头部中的以太类型字段判断协议的类型。现在我们在大多数情况下都是使用TCP/IP协议,但除了TCP/IP之外还有很多其他类型的协议,例如NetWare中使用的IPX/SPX,以及Mac电脑中使用的AppleTalk等协议。这些协议都被分配了不同的以太类型,如0080(十六进制)代表IP协议,网卡驱动就会把这样的包交给TCP/IP协议栈;如果是809B则表示AppleTalk协议,就把包交给AppleTalk协议栈,以此类推[插图]

2.5.11 将服务器的响应包从IP传给TCP

​ 如果接收方IP地址不是自己的地址,那一定是发生了什么错误。客户端计算机不负责对包进行转发,因此不应该收到不是发给自己的包[插图]。当发生这样的错误时,IP模块会通过ICMP消息将错误告知发送方(图2.1)。ICMP规定了各种类型的消息,如表2.4所示。当我们遇到这个错误时,IP模块会通过表2.4中的Destinationunreachable消息通知对方。从这张表的内容中我们可以看到在包的接收和转发过程中能够遇到的各种错误,因此希望大家看一看这张表。

主要的ICMP消息
在这里插入图片描述

​ 如果接收方IP地址正确,则这个包会被接收下来,这时还需要完成另一项工作。IP协议有一个叫作分片的功能,具体的内容我们将在第3章探索路由器时进行介绍。简单来说,网线和局域网中只能传输小包,因此需要将大的包切分成多个小包。如果接收到的包是经过分片的,那么IP模块会将它们还原成原始的包。分片的包会在IP头部的标志字段中进行标记,当收到分片的包时,IP模块会将其暂存在内部的内存空间中,然后等待IP头部中具有相同ID的包全部到达,这是因为同一个包的所有分片都具有相同的ID。此外,IP头部还有一个分片偏移量(fragment offset)字段,它表示当前分片在整个包中所处的位置。根据这些信息,在所有分片全部收到之后,就可以将它们还原成原始的包,这个操作叫作分片重组。

​ 到这里,IP模块的工作就结束了,接下来包会被交给TCP模块。TCP模块会根据IP头部中的接收方和发送方IP地址,以及TCP头部中的接收方和发送方端口号来查找对应的套接字[插图]。找到对应的套接字之后,就可以根据套接字中记录的通信状态,执行相应的操作了。例如,如果包的内容是应用程序数据,则返回确认接收的包,并将数据放入缓冲区,等待应用程序来读取;如果是建立或断开连接的控制包,则返回相应的响应控制包,并告知应用程序建立和断开连接的操作状态。

2.6 UDP协议的收发操作

2.6.1 不需要重发的数据用UDP发送更高效

​ 最简单的方法是数据全部发送完毕之后让接收方返回一个接收确认。这样一来,如果没收到直接全部重新发送一遍就好了,根本不用像TCP一样要管理发送和确认的进度。但是,如果漏掉了一个包就要全部重发一遍,怎么看都很低效。为了实现高效的传输,我们要避免重发已经送达的包,而是只重发那些出错的或者未送达的包。

​ TCP之所以复杂,就是因为要实现这一点。不过,在某种情况下,即便没有TCP这样复杂的机制,我们也能够高效地重发数据,这种情况就是数据很短,用一个包就能装得下。如果只有一个包,就不用考虑哪个包未送达了,因为全部重发也只不过是重发一个包而已,这种情况下我们就不需要TCP这样复杂的机制了。而且,如果不使用TCP,也不需要发送那些用来建立和断开连接的控制包了。此外,我们发送了数据,对方一般都会给出回复,只要将回复的数据当作接收确认就行了,也不需要专门的接收确认包了。

2.6.2 控制用的短数据

​ 这种情况就适合使用UDP。像DNS查询等交换控制信息的操作基本上都可以在一个包的大小范围内解决,这种场景中就可以用UDP来代替TCP。

​ UDP没有TCP的接收确认、窗口等机制,因此在收发数据之前也不需要交换控制信息,也就是说不需要建立和断开连接的步骤,只要在从应用程序获取的数据前面加上UDP头部,然后交给IP进行发送就可以了

​ 交给IP进行发送就可以了(表2.5)。接收也很简单,只要根据IP头部中的接收方和发送方IP地址,以及UDP头部中的接收方和发送方端口号,找到相应的套接字并将数据交给相应的应用程序就可以了。除此之外,UDP协议没有其他功能了,遇到错误或者丢包也一概不管

UDP表头控制字段
在这里插入图片描述

2.6.3 音频和视频数据

​ 还有另一个场景会使用UDP,就是发送音频和视频数据的时候。音频和视频数据必须在规定的时间内送达,一旦送达晚了,就会错过播放时机,导致声音和图像卡顿

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值