网络二.用电信号传输 TCP/IP 数据

网络二.用电信号传输 TCP/IP 数据

本章我们将探索操作系统中的网络控制软件(协议栈)和网络硬件(网 卡)是如何将浏览器的消息发送给服务器的

2.1 创建套接字

2.1.1 协议栈的内部结构

如图所示
在这里插入图片描述

上面的部分是网络应用程序,也就是浏览器 可以理解为需要使用网络的应用程序,它们会将收发数据等工作委派给下层的部分来完成。

应用程序的下面是 Socket 库,其中包括解析器,解析器用来向 DNS服务器发出查询;

再下面就是操作系统内部了,其中包括协议栈。协议栈的上半部分有两块,分别是负责用 TCP 协议收发数据的部分和负责用 UDP 协议收发数据的部分,它们会接受应用程序的委托执行收发数据的操作;

注意:浏览器、邮件等一般应用程序收发数据时用 TCP;DNS 查询等收发较短的控制数据时用 UDP。

下面一半是用 IP 协议控制网络包收发操作的部分。在互联网上传送数据时,数据会被切分成一个一个的网络包;而将网络包发送给通信对象的操作就是由 IP 来负责的。IP 中还包括 ICMP协议和 ARP 协议。ICMP 用于告知网络包传送过程中产生的错误以及各种控制消息,ARP 用于根据 IP 地址查询相应的以太网 MAC 地址

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

2.1.2套接字的实体就是通信控制信息

协议栈有一块用于存放控制信息的内存空间;什么是控制信息;就是记录了要通信的对象的的 IP 地址、端口号、通信操作的进行状态等;

协议栈在发送或接受消息的时候是需要这些控制信息;Windows 中可以用 netstat 命令显示套接字内容

##一行数据相当于一个套接字的控制信息
  协议    本地地址                 外部地址                状态           PID
  TCP    0.0.0.0:80             0.0.0.0:0              LISTENING       4   ##这表示通信还没开始,IP 地址不
  TCP    0.0.0.0:135            0.0.0.0:0              LISTENING       1012
  TCP    0.0.0.0:443            0.0.0.0:0              LISTENING       3568
  TCP    192.168.1.5:50292      125.77.167.184:80      CLOSE_WAIT      16508
  TCP    192.168.1.5:50293      125.77.167.184:80      CLOSE_WAIT      4468
  TCP    192.168.1.5:50757      36.155.249.96:443      ESTABLISHED     7896
  TCP    192.168.1.5:50824      120.204.10.154:443     CLOSE_WAIT      7896
  TCP    192.168.1.5:50872      120.241.186.18:443     CLOSE_WAIT      7896
  TCP    192.168.1.5:50936      120.204.10.154:443     CLOSE_WAIT      7896
  TCP    192.168.1.5:50976      111.206.209.80:443     CLOSE_WAIT      6896
  TCP    192.168.1.5:50979      8.136.215.212:443      ESTABLISHED     2620

2.1.3调用 socket 时的操作

在这里插入图片描述

应用程序调用 socket 申请创建套接字,协议栈根据应用程序的申请执行创建套接字的操作,创建套接字时,首先分配一个套接字所需的内存空间,然后向其中写入初始状态。创建的这个套接字的描述符在返回给应用程序

2.2 连接服务器

2.2.1 什么是连接

需要把服务器的 IP 地址和端口号等信息告知协议栈;连接实际上是通信双方交换控制信息

2.2.2 控制信息

分为两类

第一类是客户端和服务器相互联络时交换的控制信息;这些在TCP 连接的协议内都是有定义;这些控制信息表示连接的过程中的各种状态;这些信息存储在网络包的头部位置,每个协议都会有自己协议的头部信息,为了避免各种不同的头部发生混淆,我们一般会记作 TCP 头部、以太网头部、IP 头部

TCP 头部格式

字段名称长度 (比特)bit含  义一起20byte+可选序号
发送方端口号16发送网络包的程序的端口号21
接收方端口号16网络包的接收方程序的端口号22
序号 :发送数据的顺序编号32发送方告知接收方该网络包发送的数据相当于所有发送数据的第几个字节43
ACK 号:接收数据的顺序编号32接收方告知发送方接收方已经收到了所有数据的第几个字节。
其中,ACK 是 acknowledge 的缩写
44
数据偏移量4表示数据部分的起始位置,也可以认为表示头部的长度0.55
保留6该字段为保留,现在未使用0.756
控制位
flags
6该字段中的每个比特分别表示以下通信控制含义
URG:表示紧急指针字段有效
ACK:表示接收数据序号字段有效,一般表示数据已被接收方收到
PSH:表示通过 flush 操作发送的数据
RST:强制断开连接,用于异常中断的情况
SYN:发送方和接收方相互确认序号,表示连接操作
FIN:表示断开连接
0.757
窗口16接收方告知发送方窗口大小(即无需等待确认可一起发送的数据量)28
校验和16用来检查是否出现错误29
紧急指针16表示应紧急处理的数据位置210
可选字段长度可变除了上面的固定头部字段之外,还可以添加可选字段,
但除了连接操作之外,很少使用可选字段
h11

在这里插入图片描述

抓包分析

在这里插入图片描述

2.2.3 连接操作的实际过程

Socket 库的 connect :connect(< 描述符 >, < 服务器 IP 地址和端口号 >, …)

三次握手其实是说的客户端建立连接到服务端

客户端先创建一个包含表示开始数据收发操作的控制信息的头部,头部包含很多字段,这里要关注的重点是发送方和接收方的端口号

1.然后,我们将头部中的控制位的 SYN 比特设置为 1,大家可以认为它表示连接 发送至服务器 (套接字已经创建,但是还没有服务器信息)

2.服务器的 TCP 模块会返回响应,这个过程和客户端一样,需要在 TCP 头部中设置发送方和接收方端口号以及 SYN 比特,在返回响应时还需要将 ACK 控制位设为1,这表示已经接收到相应的网络包;ACK 比特确认网络包是否已经送达

3.网络包就会返回到客户端,如果 SYN 为 1 则表示连接成功,这时会向套接字中写入服务器的 IP 地址、端口号等信息,并修改状态为连接完毕,但是其实还有最后一个步骤 服务器返回的 ACK =1 响应的客户端需要将 ACK 比特设置为 1 并发回服务器,告诉服务器刚才的响应包已经收到。当这个服务器收到这个返回包之后,连接操作才算全部完成

这里继续抓包分析

第一帧
在这里插入图片描述

第二帧
在这里插入图片描述

第三帧
在这里插入图片描述

2.3 收发数据

2.3.1 请求消息交给协议栈

连接建立好后,就会发送数据,从应用程序调用 write 将要发送的数据交给协议栈。协议栈收到数据后执行发送操作,协议栈并不关心是什么数据,对他而言反正都是二进制数据;协议栈发送数据并不是收到数据立刻就发送出去,而是把数据放在一个缓冲区域内,到达一定数量后再来发送数据;这样做就不需要把数据拆分成许多很小的数据包;至于缓冲区数据的多少,这个是有上层的应用程序决定的;但是他的最大值还是和操作系统的版本有关系的;

总结的来说就是操作系统决定你最大一次可以发多少,你的应用程序可以指定协议栈一次发送的数据只要不超过这个最大值就可以了;

注意:

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

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

但是为了保证数据发送的频率,协议栈内部还会有一个定时器,即便没有达到MSS ,到达定时器的时间后,也会把数据发送出去;

在这里插入图片描述

2.3.2 对较大的数据进行拆分

一次请求的数据长度超过MSS 就需要应数据拆分发送

在这里插入图片描述

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

发送方说的是“现在发送的是从第 ×× 字节开始的部分,一共有 ×× 字节哦!

接收方则回复说, “到第 (ACK)×× 字节之前的数据我已经都收到了哦!

在这里插入图片描述

在这里插入图片描述

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

放回的Ack 信号表示接收方接收到数据,从发送方发送数据到发送方接收到到ACK 信号的时间会随着网络的情况每次不一样,如果每次接收的ACK信号需要很长时间那么,协议栈会适当的调整等待时间;反之网络很好的情况下,会去适当的减少等待ACK 信号的时间;

2.3.5 使用窗口有效管理 ACK 号

如果是TCP 采用串行话的方式发送数据,也就是直到接到ACK 信号再去发送下一个数据包,那他的等待时间内什么事情也不做,就会很浪费时间;所以这里TCP 采用的这样的滑动窗口方式来管理数据发送和 ACK 号的操作。所谓滑动窗口,就是在发送一个包之后,不等待 ACK 号返回,而是直接发送后续的一系列包;

在这里插入图片描述

接收方会在Windows 字段里面放回给发送方自己还可以接收多少数据; 然后发送方可以在这个窗口期间一次性的发送这么多的数据还不用等待ACK;接收方把接收到的数据放在一个缓存里面,并根据接收的数据拼接成完全的数据,当接收的数据达到最大数据量的时候,在把数据从缓存区拿出来,并发送给发送方自己释放后的空间大小,这样一来,发送方就不会发送过多的数据,导致超出接收方的处理能力了

最大数据量称为窗口大小 ,它是 TCP 调优参数中非常有名的一个;现在的机器往往性能比较高,窗口数据还没有满,就被释放给程序处理了

在这里插入图片描述

2.3.6 ACK 与窗口的合并

更新窗口的时机:不需要每次吧窗口的大小数据放回到发送方,因为是发送方可以根据前一个接收到的窗口大小和接收后发送的数据量相减之后,就可以得到接收方剩余的窗口大小,那么什么时候更新窗口呢,就是应用程序去在缓存里面取数据的时候 这个时候缓存空间被释放,就可以发送更新后的窗口大小给发送方;

在等待发送ACK 号的时候正好需要更新窗口,这时就可以把 ACK 号和窗口更新放在一个包里发送,从而减少包的数量。当需要连续发送多个 ACK 号时,也可以减少包的数量,这是因为 ACK 号表示的是已收到的数据量,也就是说,它是告诉发送方目前已接收的数据的最后位置在哪里,因此当需要连续发送 ACK 号时,只要发送最后一个 ACK 号就可以了,中间的可以全部省略;窗口更新也是这样,应用程序连续在缓存中读取数据,这样窗口大小也可以合并发送;

2.3.7 接收 HTTP 响应消息

浏览器在委托协议栈发送请求消息之后,会调用 read 程序来获取响应消息,和发送数据一样,接收数据也需要将数据暂存到接收缓冲区中;但这个时候可能还没有数据响应过来,那么此时协议栈就会把这个程序的工作挂起(协议栈可能回去响应其他程序的网络请求),知道响应数据过来时后,再继续执行接收操作;

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

2.4.1 数据发送完毕后断开连接

数据发送完毕的一方会发起断开过程但不同的应用程序会选择不同的断开时机;这一判断是应用程序作出的,协议栈在设计上允许任何一方先发起断开过程

比如来说客户端发起断开请求

结合第一帧

给服务端 发起断开请求信号 FIN=1 SEQ = n

在这里插入图片描述

第二帧

告知客户端发送 收到 FIN(断开) 为 1 的包 (ACK = Seq+1 ) 表示收到

服务端进入断开状态

在这里插入图片描述

第三帧

给客户端端也发送一个FIN 表示要断开 FIN=1 SEQ = j

在这里插入图片描述

第四帧

客户端收到 FIN=1 客户端断开 ACK = j+1 客户端进入断开状态

在这里插入图片描述

2.4.2 删除套接字

防止网络传输的不稳定,一般套接字的删除会滞后于断开的连接;协议中对于这个时间间隔没有明确的规定,一般来说会等待几分钟之后再删除套接字

2.4.3 数据收发操作小结

在这里插入图片描述

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

2.5.1 包的基本知识

应用程序把数据拆分变成包 先叫数据包吧;数据包交给TCP 模块,TCP 模块会翻转TCP头部+数据包 ==》TCP包;TCP 包再交给IP模块 去发送数据 ,下面就是讨论IP是如何发送数据的 ;

之前也是将解过 包是有两部分构成的 头部的控制信息和除了头部的信息就是要发送给对方的数据;发送方的网络设备会负责创建包,创建包的过程就是生成含有正确控制信息的头部,然后再附加上要发送的数据。

在这里插入图片描述

包会发送到附加的转发设备,转发设备会根据头部中的信息来判断下一步去哪里;这个过程中需要用到一张表;这张表里面记录了每一个地址对应的发送方向,也就是按照头部里记录的目的地址在表里进行查询,并根据查到的信息判断接下来应该发往哪个方向;接下来,包在向目的地移动的过程中,又会到达下一个转发设备,然后又会按照同样的方式被发往下一个转发设备;最后到达目标地址

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

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

实际上,集线器是按照以太网规则传输包的设备,而路由器是按照 IP规则传输包的设备,因此我们也可以作如下理解。

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

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

TCP/IP 包包含如下两个头部:MAC 头部(以太网协议),IP 头部(IP 协议)

数据包的传递

下面讲解的是数据包的传递不是在一个局域网内;数据包会先到路由器;路由器中有一张 IP 协议的表,可根据这张表以及 IP 头部中记录的目的地信息查出接下来应该发往哪个路由器。为了将包发到下一个路由器,我们还需要查出下一个路由器的 MAC 地址,并记录到 MAC 头部中,大家可以理解为改写了 MAC 头 部。这样,网络包就又被发往下一个节点了;网络包会通过路由器到达下一个路由器 R2。这个过程不断重复,最终网络包就会被送到目的地,当目的地设备成功接收之后,网络包的传输过程就结束了;

在这里插入图片描述

2.5.2 包收发操作概览

包收发操作的起点是 TCP 模块委托 IP 模块发送包的操作;IP 模块会将包的内容当作一整块数据,在前面加上包含控制信息的头部;IP 模块会添加 IP 头部和 MAC 头部这两种头部。

  • IP 头部中包含 IP 协议规定的、根据 IP 地址将包发往目的地所需的控制信息;

  • MAC 头部包含通过以太网的局域网将包传输至最近的路由器 (本机会通过arp 获取路由mac 地址)

在这里插入图片描述

包封装好后就可以吧数据传递给网卡,网卡会把0101的数字信号转变成电信号或者光信号,在通过光纤或者网线发送出去;IP模块打包TCP模块传递的数据的时候,并不会关系数据的连续性和可靠性,只是将委托的东西打包送到对方手里,或者是将对方送来的包接收下来,仅此而已;

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

IP 头部数据格式

字段名称含 义长度(比特)序号
版本号4IP 协议版本号,目前使用的是版本 41
头部长度(IHL)4IP 头部的长度。可选字段可导致头部长度变化,因此这里需要指定头部的长度2
服务类型(ToS)8表示包传输优先级。最初的协议规格里对这个参数的规定很模糊,最近 DiffServ 规格重新定义了这个字段的用法3
总长度16表示 IP 消息的总长度4
ID 号16用于识别包的编号,一般为包的序列号。如果一个包被 IP 分片,则所有分片都拥有相同的 ID5
标志(Flag)3该字段有 3 个比特,其中 2 个比特有效,分别代表是否允许分片,以及当前包是否为分片包6
分片偏移量13表示当前包的内容为整个 IP 消息的第几个字节开始的内容7
生存时间(TTL)8表示包的生存时间,这是为了避免网络出现回环时一个包永远在网络中打转。
每经过一个路由器,这个值就会减 1,减到 0 时这个包就会被丢弃
8
协议号8协议号表示协议的类型(以下均为十六进制)。
TCP: 06
UDP: 11
ICMP: 01
9
头部校验和16用于检查错误,现在已不使用10
发送方 IP 地址32网络包发送方的 IP 地址11
接收方 IP 地址32网络包接收方的 IP 地址12
可选字段可变长度除了上面的头部字段之外,还可以添加可选字段

在这里插入图片描述

Source Address 是发送方网卡的地址

路由器使用 IP 表判断下一个路由器位置的操作是一样的。因为协议栈的 IP模块与路由器中负责包收发的部分都是根据 IP 协议规则来进行包收发操作的,所以它们也都用相同的方法来判断把包发送给谁这个“IP 表”叫作路由表 route table

route print

示例

在这里插入图片描述

默认路由 :netmask:0.0.0.0 的路由条目,主机不能在路由表中查找到目标主机的IP地址或网络路由时,数据包就被发送到默认路由(默认网关)上

我们将在第后续章节详细介绍

  1. 传递数据到192.168.1.21

    192.168.1.21 地址:与 上255.255.255.0 ==》192.168.1.0 匹配到第六行 会走那个路由

  2. 传递数据到10.10.1.166

​ 10.10.1.166 地址:与 上255.255.255.0 ==》 10.10.1.0 匹配到第三行 会走那个路由

解读上面的字段含义:

interface 表示网卡或者是网络接口 发送数据的IP地址

Gateway 表示网关下一个路由器的IP地址 把数据包发给这个路由器 路由器会把数据转发到目标地址

2.5.4 生成以太网用的 MAC 头部

IP模块在完成对IP头部的封装之后还需要在封装一层MAC头部;在以太网中 发送数据是通过MAC 地址的;我们说的局域网还是互联网说的是网络规模越来越大,而以太网就相当于最小的概念的意思就是在最小的一个环节里面发送数据是依赖于以太网的协议的,MAC 头部就是以太网中传递数据的;MAC 头部是以太网使用的头部,它包含了接收方和发送方的 MAC 地址等信息

字段名称长度(比特)含  义
接收方 MAC 地址48网络包接收方的 MAC 地址,
在局域网中使用这一地址来传输网络包
发送方 MAC 地址48网络包发送方的 MAC 地址,
接收方通过它来判断是谁发送了这个包
以太类型16使用的协议类型。下面是一些常见的类型,
一般在 TCP/IP 通信中只使用 0800 和 0806这两种。
0000-05DC:IEEE 802.3
0800   :IP 协议
0806  :ARP 协议
86DD  :  IPv6

MAC 地址是写在网卡里面的ROM 里面,那块网卡发送数据就使用那块网卡的Mac地址;就是发送方MAC 是网卡地址;接收方mac 地址是 不知道的,但是查看路由表找到匹配的 发给Gateway里面的IP地址就可以;当时发到路由器需要把路由器的MAC地址写上去;所以要把根据IP地址查询MAC地址

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

这里我们需要使用 ARP,它其实非常简单。在以太网中,有一种叫作广播的方法,可以把包发给连接在同一以太网中的所有设备。ARP 就是利用广播对所有设备提问:“×× 这个 IP 地址是谁的?请把你的 MAC 地址告诉我。”然后就会有人回答:“这个 IP 地址是我的,我的 MAC 地址是××××。如果处于一个子网中,就可以得到对方的IP地址,得到的MAC地址写入MAC头部;这个叫arp 查询MAC地址;查询后会在一段时间内缓存起来这个IP对应的MAC地址,但是几分钟后会失效,那么就会去重新查询一次;

在这里插入图片描述

2.5.6 以太网的基本知识

在这里插入图片描述

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

a) 当一台计算机发送信号时,信号就会通过网线流过整个网络,最终到达所有的设备。不过,我们无法判断一个信号到底是发给谁的,因此需要在信号的开头加上接收者的信息,也就是地址这样一来就能够判断信号的接收者了,与接收者地址匹配的设备就接收这个包,其他的设备则丢弃这个包,这样我们的包就送到指定的目的地了。这个地址就是MAC地头部

b) 后面就演变成b 这样,这个结构是将主干网线替换成了一个中继式集线器,将收发器网线替换成了双绞线;但信号会发送给所有设备这一基本性质并没有改变

c)现在我们说的以太网指的都是这样的结构c 即信号会发送给所有设备这一性质变了,现在信号只会流到根据 MAC 地址指定的设备,而不会到达其他设备了

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

以太网和 IP 一样,并不关心网络包的实际内容,因此以太网的收发操作也和 TCP 的工作阶段无关,都是共通的;

2.5.7 将 IP 包转换成电或光信号发送出去

先看看网卡结构

在这里插入图片描述

把数字信号转换成光电信号才可以发送出去;执行的这个过程的是硬件网卡

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

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

在这里插入图片描述

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

在这里插入图片描述

0 和 1 两种比特分别对应特定的电压和电流,读取数据就反过来;

在这里插入图片描述

分界线是我吗人为画出来的,所以我吗需要一个辅助的时钟信号去帮忙识别每个比特的分界线;那就需要我们把数据信号和时钟信号都发送出去,但是时钟信号或者数据信号在长距离的数据传输可能会出现偏移,为了解决这个问题,就把两个时钟信号叠加到一起发送数据,减少出错率,因为时钟信号是稳定的,只要知道其变化的规律,数据包前面的56比特就是查找时钟变化的周期,这个就是报头的作用

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

2.5.9 向集线器发送网络包

在这里,将数字信息转换为电信号的速率就是网络的传输速率;例如每秒将 10 Mbit 的数字信息转换为电信号发送出去,则速率就是 10 Mbit/s

2.5.10 接收返回包

在使用集线器的半双工模式以太网中,一台设备发送的信号会到达连接在集线器上的所有设备;信号的开头是报头,通过报头的波形同步时钟,然后遇到起始帧分界符时开始将后面的信号转换成数字信息;这里的工作时和发送数据步骤是相反的;接受数据后FCS 校验,没有问题,解析MAC头部数据上看看是不是数据发给自己的,不是的直接丢弃,是的话数据包放到缓冲区,接下里网卡会通知计算机收到数据包;通知计算机的操作会使用一个叫作中断的机制。在网卡执行接收包的操作的过程中,计算机并不是一直监控着网卡的活动,而是去继续执行其他的任务;网卡通过中断控制器连接CPU;,CPU 会暂时挂起正在处理的任务,切换到操作系统中的中断处理程序 。然后,中断处理程序会调用网卡驱动,控制网卡执行相应的接收操作;然后包交由协议栈,协议栈再把数据包交给各个应用程序;

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

客户端计算机不负责对包进行转发,因此不应该收到不是发给自己的包,当发生这样的错误时,IP 模块会通过 ICMP 消息将错误告知发送方;ICMP 规定了各种类型的消息

消息类型含义
Echo reply0响应 Echo 消息
Destination unreachable3出于某些原因包没有到达目的地而是被丢弃,则通过此消息通知发送方。可能的原因包括目标 IP 地址在路由表中不存在;目标端口号不存在对应的套接字;需要分片,但分片被禁用
Source quench4当发送的包数量超过路由器的转发能力时,超过的部分会被丢弃,这时会通过这一消息通知发送方。但是,并不是说遇到这种情况一定会发送这一消息。当路由器的性能不足时,可能连这条消息都不发送,就直接把多余的包丢弃了。当发送方收到这条消息时,必须降低发送速率
Redirect5当查询路由表后判断该包的入口和出口为同一个网络接口时,则表示这个包不
需要该路由器转发,可以由发送方直接发送给下一个路由器。遇到这种情况时,路由器会发送这条消息,给出下一个路由器的 IP 地址,指示发送方直接发送过去
Echo8ping 命令发送的消息。收到这条消息的设备需返回一个
Echo reply 消息,以便确认通信对象是否存在
Time exceeded11由于超过了 IP 头部中的 TTL 字段表示的存活时间而被路;
由器丢弃,此时路由器会向发送方发送这条消息
Parameter problem12由于 IP 头部字段存在错误而被丢弃,此时会向发送方发送这条消息

2.6 UDP 协议的收发操作

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

有些应用程序不使用 TCP 协议,而是使用 UDP 协议来收发数据。向 DNS 服务器查询 IP 地址的时候我们用的也是 UDP 协议。下面就简单介绍一下 UDP 协议;TCP IP的复杂性是为了其可靠性传输。所以其效率也是偏低;而在UDP 协议里面不需要处理这样的问题;数据不管接收方是否收到数据;

2.6.2 控制用的短数据

UDP 没有 TCP 的接收确认、窗口等机制,因此在收发数据之前也不需要交换控制信息,也就是说不需要建立和断开连接的步骤,只要在从应用程序获取的数据前面加上 UDP 头部,然后交给 IP 进行发送就可以了。接收也很简单,只要根据 IP 头部中的接收方和发送方 IP 地址,以及 UDP 头部中的接收方和发送方端口号,找到相应的套接字并将数据交给相应的应用程序就可以了

字段名称长度(比特)含  义
发送方端口号16网络包发送方的端口号
接收方端口号16网络包接收方的端口号
数据长度16UDP 头部后面数据的长度
校验和16用于校验错误

2.6.3 音频和视频数据

UDP 使用场景:即是的音频和视频 类似于直播吧;音频和视频数据必须在规定的时间内送达,一旦送达晚了,就会错过播放时机,导致声音和图像卡顿;用TCP 的话确认收发需要时间 错发数据重发也不适合;

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值