TCP/IP协议

1. TCP/IP协议栈的内容

1.1 七层模型和四层模型

网络通信中,有osi七层模型和TCP/IP四层模型。osi七层模型是在协议开发前设计的,具有通用性,但TCP/IP在实际的应用中效率更高,成本更低。
在这里插入图片描述
应用层:访问网络服务的端口;
表示层:提供数据格式转换服务,数据转换编码,数据压缩解压,数据加密解密;
会话层:建立端连接并提供验证和会话管理;
传输层:为应用层实体提供端到端的通信功能,处理数据包错误和次序;
网络层:逻辑地址寻址和路由选择,实现不同网络之间的路径选择;
数据链路层:数据分帧,硬件物理地址寻址、差错校验;
物理层:将数据转换为二进制比特流。
注意:ARP和RARP协议是建立逻辑地址(IP地址)和物理地址(MAC地质)映射的协议,所以既可以将它们当作网络层协议,又可以将它们当作数据链路层协议。
在日常使用中,链路层常用的有ARP和RARP协议,网络层常用的有IP协议、ICMP以及IGMP协议,传输层常用的有TCP协议和UDP协议,应用层常用的有http、https以及DNS协议、DHCP协议。
1.2 数据在协议栈中的封装
当应用数据用TCP传送数据时,数据被送入协议栈中(从应用层-数据链路层),然后每一层会进行封装(加入首部和尾部信息),封装后被转换为二进制比特流后转出。接收者在接到二进制比特流数据后,会对称的由数据链路层-应用层传输,每一层解开首部和尾部信息,得到真实的应用数据,完成数据的传输。
在这里插入图片描述
在这里插入图片描述

其中,Appl首部为应用层协议(比如http)添加的首部,TCP首部20字节(UDP首部8字节),IP首部20字节,以太网首部14字节,以太网尾部4字节,这在之后会详细展开。
数据经过TCP包装后成为TCP(报文)段,TCP段通过IP封装后成为IP数据报,IP数据报通过链路层封装后成为帧。即数据在传输层、网络层以及数据链路层中的称呼分别为段、数据报、帧。

2. 数据链路层

数据链路层的作用包括:物理(硬件)地址寻址、数据报成帧、流量控制、数据的检错和重发等。这一层常用的协议有ARP协议和RARP协议。

2.1 以太网帧的结构

参考链接:http://t.zoukankan.com/zy09-p-15545684.html
数据报在以太网物理介质上传播之前必须封装头部和尾部信息。封装后的数据报称为数据帧,数据帧中封装的信息决定了数据如何传输。
每个以太网帧都有一个前同步码(Preamble/SFD),前同步码由8个字节组成,其中前七个字节都是10101010,该部分的作用是通知接收方有数据帧到来,使其与输入的时钟保持同步,最后一个字节为10101011,最后使用11,来通知接收方下一字段就是目的主机的地址了。注意:实际上前导码都是在物理层加进去的,并不是帧的一部分。
以太网上有两种标准帧格式,一种是Ethernet II帧格式,另一种是IEEE 802.3格式,它们的区别在于,当Type字段值小于等于1500(或者十六进制的0x05DC)时,帧使用的是IEEE 802.3格式。当Type字段值大于等于1536 (或者十六进制的0x0600)时,帧使用的是Ethernet II格式。以太网中大多数的数据帧使用的是Ethernet II格式。

2.1.1 Ethernet II帧格式

在这里插入图片描述

以太网数据帧的总长度为64字节-1518字节。
(1)D.MAC:目的MAC地址。D.MAC长度为6个字节,标识帧的接收者。
(2)S.MAC:源MAC地址。S.MAC长度为6个字节,标识帧的发送者。
(3)类型字段Type:用于标识数据字段中包含的高层协议,该字段长度为2个字节。类型字段取值为0x0800代表IP协议帧;类型字段取值为0x0806代表ARP协议帧。0x8035代表RARP协议帧。
(4)数据字段Data:网络层传过来的数据报,最小长度必须为46字节以保证帧长至少为64字节,数据字段的最大长度为1500字节(帧对应为1518字节)。
(5)FCS:通过循环冗余算法(CRC)产生的循环冗余校检字段,4个字节,提供一种错误检测机制。

2.1.2 IEEE 802.3帧格式

在这里插入图片描述

以太网数据帧的总长度为64 -1518字节。其中D.MAC、S.MAC、Data、FCS的意义与Ethernet II帧格式相同。不同的为:
(1)Length:2个字节。定义了Data字段包含的字节数。
(2)LLC:逻辑链路控制LLC(Logical Link Control)由目的服务访问点DSAP(Destination Service Access Point)、源服务访问点SSAP(Source Service Access Point)和Control字段组成。
(3)SNAP:SNAP(Sub-network Access Protocol)由机构代码(Org Code)和类型(Type)字段组成。Org code三个字节都为0。Type字段的含义与Ethernet_II帧中的Type字段相同。

2.1.3 区分Ethernet II和IEEE 802.3帧协议
Ethernet II 格式相对使用广泛。

从Type/Length字段值可以区分两种帧类型:当Type字段值小于等于1500(0x05DC)时,帧使用的是IEEE 802.3格式。当Type字段值大于等于1536(0x0600)时,帧使用的是Ethernet II格式。

2.2 ARP协议

ARP协议建立IP地址到MAC地址的动态映射以保证通信的顺利进行。ARP协议的基本功能是使用目标主机的IP地址,查询其对应的MAC地址,以保证底层链路上数据报通信的进行。建立网络层到数据链路层的联系。

2.2.1 封装后的ARP请求/应答报文结构

在这里插入图片描述

ARP本身报文有28字节,以太网地址指的就是物理地址,即MAC地址。

字段1是ARP请求目的地以太网地址。
字段2是发送ARP请求的以太网地址。
字段3以太网帧类型表示的是后面的数据类型,ARP请求和ARP应答这个值为0x0806。前三个字段是以太网帧首部。
字段4表示硬件地址的类型,硬件地址不只以太网一种,是以太网类型时此值为1。
字段5表示要映射的协议地址的类型,要对IPv4地址进行映射,此值为0x0800。
字段6和7表示硬件地址长度和协议地址长度,MAC地址占6字节,IP地址占4字节。
字段8是操作类型字段,值为1,表示进行ARP请求;值为2,表示进行ARP应答;值为3,表示进行RARP请求;值为4,表示进行RARP应答。
字段9是发送端ARP请求或应答的硬件地址,这里是以太网地址,和字段2相同。
字段10是发送ARP请求或应答的IP地址。
字段11和12是目的端的硬件地址和协议地址。
注意:只有ARP缓存表中没有目的MAC或者要删除MAC时,才会触发ARP请求,ARP请求也会以帧的形式发送出去。由于ARP报文只有28字节,而Ethernet II帧的data部分最少有46字节,故还需要有18个字节的填充。

2.2.2 ARP寻址过程

参考链接: https://blog.csdn.net/qq_38902271/article/details/110213222
为了实现在MAC地址与IP地址间的转换,ARP协议中引入了ARP缓存表的概念。ARP缓存表中记录了一条一条的<IP地址,MAC地址,有效时间>对,他们是主机最近运行获得的关于周围其他主机的IP地址到MAC 地址的绑定,当需要发送数据包时,主机首先根据目的IP地址来查找ARP缓存表,并将匹配的MAC地址装入以太网帧首部,最后发送以太网数据。如果缓存表没有信息或者信息失效,就需要自行查找并建立,寻址过程如下:
在这里插入图片描述

ARP协议的核心就是对ARP缓存表的操作。发送数据包时,查找缓存表以得到目的MAC地址,此外,ARP还需要不断地处理ARP请求包和ARP应答包,以保证缓存表中各个表项的有效性。ARP的实质就是对缓存表的建立、更新、查询等操作。在linux中可以通过arp命令在查询arp缓存表。

2.2.3 ARP表

静态ARP表通过手工配置和维护,不会被老化,不会被动态ARP表项覆盖。动态ARP表由ARP协议通过ARP报文自动生成和维护,可以被老化,可以被新的ARP报文更新,可以被静态ARP表项覆盖。当到达老化时间、接口down时会删除相应的动态ARP表。
相对来说,静态ARP由于网络稳定,适用于拓扑简单,或安全要求高的企业或单位,而动态ARP适用于拓扑结构复杂、带宽资源紧张切对通信质量要求不是很高的企业。

3. 网络层

网络层常用于逻辑地址(IP地址)寻址和路由选择,实现不同网络之间的路径选择,常见的网络层协议有IP协议、ICMP协议以及IGMP协议。

3.1 IP协议

IP协议是TCP/IP协议族的动力,它为上层协议提供无状态、无连接、不可靠的服务。无状态是指IP通信双方不同步传输数据的状态信息,无连接是指IP通信双方都不长久地维持对方的任何信息。这样上层协议每次发送数据的时候,都必须明确指定对方的IP地址。不可靠是指IP协议不能保证IP数据报准确地到达接收端。IP地址=网络地址+主机地址

3.1.1 IP首部

在这里插入图片描述

(1)4位版本:指定IP协议的版本。对于IPv4来说,其值是4.其他IPv4的扩展版本(如SIP协议和PIP协议),则具有不同的版本号;
(2)4位首部长度:表示IP首部有多少字节,以4字节为单位,最少20字节(4x5),最多60字节(4位顶多表示15),默认为20字节。
(3)TOS:包括一个3位的优先权字段,4位的TOS字段和1位的保留字段(必须置0)。4位的TOS字段分别表示:最小延时,最大吞吐量,最高可靠性和最小费用。其中最多有一个能置位1,应用程序应该根据实际需要来设置它。比如像ssh和telnet这样的登陆程序需要的是最小延时服务,而文件传输程序ftp则需要最大吞吐量的服务。
(4)总长度:整个 IP数据报+IP首部 的长度。
(5)16位标识:数据报唯一标识,其初始值由系统随机生成,每发送一个数据报,其值就加1.该值在数据报分片时被复制到每个分片中,因此同一个数据报的所有分片都具有相同的标识。
(6)3位标志:目前只有前两位MF、DF有效,MF=1/0表示后面有/没有分片,DF=1/0表示不允许/允许分片。
(7)偏移:13位分片偏移是分片相对原始IP数据报开始处(仅指数据部分)的偏移。实际的偏移值是该值左移3位(乘8)后得到的。由于这个原因,除了最后一个IP分片外,每个IP分片的数据部分的长度必须是8的整数倍(这样才能保证后面的IP分片拥有一个合适的偏移量)。
(8)TTL:数据报到达目的地之前允许经过的路由器跳数。TTL值被发送端设置(常见值为64)。数据报在转发过程中每经过一个路由,该值就被路由器减1。当TTL值减为0时,路由器将丢弃数据报,并向源端发送一个ICMP差错报文。TTL值可以防止数据报陷入路由循环。
(9)协议:区分上层协议,ICMP为1,TCP是6,UDP是17.
(10)校验和:只检测IP首部,不会检测数据部分。
(11)源IP和目的IP:IP地址(4字节)
(12)选项:这部分最多包含40个字节,可用的IP选项包括记录路由、时间戳、松散源路由选择以及严格源路由选择等。

3.1.2 IP分片

当IP数据报的长度大于帧的最大传输单元MTU时(一般为1500),它将会被分片传输。需要注意的是,不仅是源主机会分片,中间的路由器如果超过了MTU也会分片,整个路径MTU的值为所有路由MTU的最小值。分片数据报的重组只会发生在目的端的IP网络层。
在这里插入图片描述

注意:在分片的数据中,传输层的首部只会出现在第一个分片中。

3.1.3 IP路由选择过程

参考链接: https://blog.csdn.net/qq1350975694/article/details/106948945/
当一个数据报发送到某个路由器时,该路由器将数据报如何发送呢。在每个路由器中都会维护一张路由表,路由表的每一行有三个基本消息:目标IP地址 下一跳IP地址(网关地址) 子网掩码。

Destination为default或者0.0.0.0时表示默认网关(路由),所有数据都可发送到这个网关,之所以这样是因为0.0.0.0表示IP待填充,表示目标主机的 IP 地址或网络不在路由表中。Getway0.0.0.0表示和本机在同一个网段,通信时不需要经过网关(即直接通信)。Genmask是Destination字段的子网掩码,当为主机时,应该为255.255.255.255,当为默认网关时,为0.0.0.0
IP地址=网络地址+主机地址,网络地址=IP地址(二进制)&子网掩码(二进制)。
路由表查找过程如下:
(1)搜索路由表,找出路由表中能与数据报目标IP地址完全匹配的主机IP地址(网络地址和主机地址都要匹配)。如果找到,就用该地址行对应的那个Gateway网关地址(下一跳地址)继续传输,没找到则转步骤2.
(2)搜索路由表,找出路由表中能与数据报目标网络地址匹配的网络地址。就用该地址行对应的那个Gateway网关地址(下一跳地址)继续传输,没找到则转步骤3.
(3)选择默认路由项,这通常意味着数据报的下一跳路由是网关。

3.2 ICMP协议

一个新搭建好的网络,往往需要先进行一个简单的测试,来验证网络是否畅通;但是IP协议并不提供可靠传输。如果丢包了,IP协议并不能通知传输层是否丢包以及丢包的原因。所以我们就需要ICMP协议来完成这样的功能。ICMP协议是网络层协议。它主要用来确认IP包是否成功到达目标地址以及通知在发送过程中IP包被丢弃的原因。ICMP的报文如下所示(一般首部为8字节):
ICMP报文包含在IP数据报中,IP首部(20字节)在ICMP报文的最前面。当IP报头中的协议字段值为1时,就说明这是一个ICMP报文。

在这里插入图片描述
在这里插入图片描述

(1)类型:占一字节,标识ICMP报文的类型,从类型值来看ICMP报文可以分为两大类。第一类是取值为1~127的差错报文,第2类是取值128以上的信息报文。
(2)代码:占一字节,标识对应ICMP报文的代码。它与类型字段一起共同标识了ICMP报文的详细类型。
(3)校验和:是对包括ICMP报文数据部分在内的整个ICMP数据报的校验和,以检验报文在传输过程中是否出现了差错。
常用的类型和代码有:
在这里插入图片描述

  1. 日常使用最多的ping,就是响应请求(Type=8)和应答(Type=0),一台主机向一个节点发送一个Type=8的ICMP报文,如果途中没有异常(例如被路由器丢弃、目标不回应ICMP或传输失败),则目标返回Type=0的ICMP报文,说明这台主机存在。
    2.目标不可到达、源抑制和超时报文。这三种报文的格式是一样的,目标不可到达报文(Type=3)在路由器或主机不能传递数据报时使用。源抑制(Type=4)则充当一个控制流量的角色,它通知主机减少数据报流量,由于ICMP没有恢复传输的报文,所以只要停止该报文,主机就会逐渐恢复传输速率。最后,无连接方式网络的问题就是数据报会丢失,或者长时间在网络游荡而找不到目标,或者拥塞导致主机在规定时间内无法重组数据报分段,这时就要触发ICMP超时报文(Type=11)的产生。超时报文的代码域有两种取值:Code=0表示传输超时,Code=1表示重组分段超时。
    3.时间戳,时间戳请求报文(Type=13)和时间戳应答报文(Type=14)用于测试两台主机之间数据报来回一次的传输时间。
3.2.1 ICMP重定向

ICMP重定向报文是ICMP控制报文中的一种。在特定的情况下,当路由器检测到一台机器使用非优化路由的时候,它会向该主机发送一个ICMP重定向报文,请求主机改变路由。重定向报文的Type=5,对应代码0~3,报文结构如下。
在这里插入图片描述
在这里插入图片描述

具体过程为:主机发送一份数据报给默认路由R1,R1接收后检查路由表发现R2的IP(网关地址)与主机源IP在同一网段,于是将该数据报发送给R2处理。同时R1发送一份ICMP重定向报文给主机,通知主机以后直接发给R2。
3.2.2 ICMP路由发现
3.2.3 ICMP不可达报文
当路由器收到一份设置了不允许分片的数据报(DF=1),但是该数据报的长度超过了MTU时,路由器就会发送ICMP不可达报文。报文的类型Type=3。

在这里插入图片描述

3.3 IGMP协议

IGMP 是Internet Group Management Protocol(互联网组管理协议)的简称。它是TCP/IP 协议族中负责IP 组播成员管理的协议,用来在IP 主机和与其直接相邻的组播路由器之间建立、维护组播组成员关系。当一台主机加入到一个新的组时,它发送一个IGMP消息到组地址以宣告它的成员身份,多播路由器和交换机就可以从中学习到组的成员。利用从IGMP中获取到的信息,路由器和交换机在每个接口上维护一个多播组成员的列表。IGMP报文也是包含在IP数据报中,即在IP首部之后。目前IGMP有三个版本。IGMP v1报文的格式如下:8字节
在这里插入图片描述

版本:IGMP版本号,有三个版本,1为v1
类型:0x11表示普遍组查询报文(Membership Query),是查询器向共享网络上所有主机和路由器发送的查询报文,用于了解哪些组播组存在成员;0x12表示成员报告报文(Membership Report),主机向查询器发送的报告报文,用于申请加入某个组播组或者应答查询报文。
校验和:包括数据在内的整个IGMP数据包的校验和。

4. 传输层

传输层为应用层实体提供端到端的通信功能,处理数据包错误和次序;传输层主要有两大协议:TCP和UDP。

4.1 传输控制协议(TCP)

TCP是面向连接的可靠的字节流传输,TCP也是被封装在IP数据报,TCP报文格式如下,正是因为TCP的特性,所以TCP适用于需要安全可靠传输的数据中。

在这里插入图片描述

(1)源端口/目的端口:数据从哪个进程来,要到哪个进程去;
(2)序号:传输字节起始序列号(可靠传输);
(3)确认号:期待收到的下一个字节的序列号(可靠传输);
(4)4位首部长度:表示TCP首部的长度,以4字节为单位,所以TCP首部最多有15*4=60字节(对应1111)。默认情况下,TCP首部占20字节,这时选项部分为0。和IP首部长度一样。
(5)保留:顾名思义,先保留以防万一;
(6)6位标志位:
 URG(urgent):标识紧急指针是否有效
 ACK(acknowledge):标识确认序号是否有效
 PSH(push):用来提示接收端应用程序立即将数据从TCP缓冲区读走
 RST(reset):要求重新建立连接。即含有RST标识的报文称为复位报文段
 SYN:请求建立连接,即含有SYN标识的报文称为同步报文段
 FIN(finish):通知对端,本端即将关闭。即含有FIN标识的报文称为结束报文段
(7)窗口大小:窗口通告值,告诉发送方一次最多所能发送的字节数;
(8)16位校验和:由发送端填充, 检验形式有CRC校验等. 如果接收端校验不通过, 则认为数据有问题. 此处的校验和不光包含TCP首部, 也包含TCP数据部分。
(9)16位紧急指针:用来标识哪部分数据是紧急数据;
(10)选项:这部分可有可无,最常见的是MSS:即TCP连接双方在建立连接时协商最大的报文段长度MSS。
TCP为了提供可靠传输,首先采用三次握手和四次挥手来建立以及断开连接,从而保证传输信道是可靠的;其次采用序列号和确认号来保证数据的顺序,采用接收确认ACK确定收到数据;然后采用超时重传的机制来保证数据的准确性质;最后采用滑动窗口和拥塞窗口机制来控制数据的传送,保证网络流畅。

4.1.1 三次握手和四次挥手

所谓的三次握手即TCP连接的建立。这个连接必须是一方主动打开,另一方被动打开的。以下为客户端主动发起连接的图解:
在这里插入图片描述

第一次握手:客户端向服务器发送报文,请求建立连接,SYN标志位为1,序号seq为x,客户端进入SYN-SENT阶段;
第二次握手:服务器收到请求后,如果同意,就向客户端发送同意接收连接的报文,报文SYN=1,ACK=1,seq=y,ack=x+1. 标志位为SYN和ACK,表示“确认客户端的报文seq序号有效,服务器能正常接收客户端发送的数据,并同意创建新连接”(即告诉客户端,服务器收到了你的数据),确认号ack=x+1表示收到客户端的序号seq并将其值加1作为自己确认号ack的值;随后服务器端进入SYN-RCVD阶段。
第三次握手:客户端收到服务器确认连接的报文后,明确了从客户端到服务器的数据传输是正常的,结束SYN-SENT阶段。并向服务器发送最后一段报文:标志位为ACK=1,表示“确认收到服务器端同意连接的信号”(即告诉服务器,我知道你收到我发的数据了);序号为seq=x+1,表示收到服务器端的确认号ack,并将其值作为自己的序号值;确认号为ack=y+1,表示收到服务器端序号seq,并将其值加1作为自己的确认号ack的值;随后客户端进入ESTABLISHED阶段。
最后服务器收到最后一段报文后,也进入ESTABLISHED阶段,双方连接建立完毕。
所谓的四次挥手即TCP连接的断开。
在这里插入图片描述

四次挥手的过程和三次握手差不多,不同的是多了一个挥手过程,这是因为在建立连接过程中,服务器SYN和ACK可以同时发出。而在挥手断开连接过程时,服务器在收到客户端断开连接请求时,自身可能还有一些数据没有发送完毕,故先发ACK表示收到请求,待数据发送完之后再发送FIN准备断开连接。
当客户端发出最后的ACK确认报文时,并不能确定服务器端能够收到该段报文。所以客户端在发送完ACK确认报文之后,会设置一个时长为2MSL的计时器。MSL指的是Maximum Segment Lifetime:一段TCP报文在传输过程中的最大生命周期。如果客户端在2MSL内,再次收到了来自服务器端的FIN报文,说明服务器端由于各种原因没有接收到客户端发出的ACK确认报文。客户端再次向服务器端发出ACK确认报文,计时器重置,重新开始2MSL的计时;否则超过2MSL表示服务器正常收到了报文,客户端断开连接。

4.1.2 超时重传机制

(1)正常无差错情况时,客户端A发送数据给服务器B,B收到数据就向A发送确认。如下图所示(无差错情况):

无差错情况在这里插入图片描述

		无差错情况(左)		                         A发送出错(右)

在这里插入图片描述在这里插入图片描述

		B确认信息丢失(左)							B确认信息延迟(右)

(2)如果A发送的过程中出现差错,B在接收M1时检测出了差错,就丢弃M1,其他什么都不做(也不会通知A收到有差错的分组)。又或者A传送的过程中分组丢失了,以上这两种情况下,B不会发送任何信息。既然说它是可靠传输协议,那自然有它可靠的方法:如果发生以上的情况,A只要超过了一段时间仍然没有收到确认,就认为刚才发送的分组丢失了,所以它会重传刚刚的发送过的分组,也就是所谓的超时重传。超时重传的原理也很简单:发送方发送完一个分组后,就会设置一个超时重传计时器,如果超时重传计时器到期之前没有收到接收方发来的确认信息,则会重发刚发送过的分组;如果收到确认信息,则撤销该超时重传计时器。如上图所示(A出错)。
这里需要注意的是,由于发送方A可能需要重传,因此A每次在发送数据时,会缓存一个副本以备使用,只有收到确认后,才会清除这个副本。
(3)如果A发送方没有问题,但是B接收后发出的确认报文丢失了。那么这个时候,A在超时重传时间内,没有收到B的确认信息,会认为是自己的信息没送达,会重新发送M1过去。而B在收到M1后,会丢弃这个重复的M1(之前已经收到过了),并再次向A发送确认报文。
(4)如果A发送方没问题,B也发送确认报文了,但是由于网络延迟,导致确认报文在超时重传计时器期间没有送达A。这时A也会重发M1,B收到后会丢弃重复的M1,并再次发送确认报文。这样,A就会收到两份确认报文,对于迟到的确认报文直接丢弃不管。
综上所述:只要A在超时重传计时器期间没有收到B的确认,就会重新发送一份M1,只有收到确认,才会删除原数据的备份。而B如果收到相同的发送信息,会丢弃重复的信息,并且重新发送确认报文。

4.1.3 滑动窗口

参考链接:https://blog.csdn.net/m0_47988201/article/details/122735834
滑动窗口协议在发送方和接收方之间各自维持一个滑动窗口,发送方是发送窗口,接收方是接收窗口,而且这个窗口是随着时间变化可以向前滑动的。它允许发送方发送多个分组而不需等待确认。TCP的滑动窗口是以字节为单位的。
在这里插入图片描述

如上图所示,发送窗口中有四个概念:已发送并收到确认的数据(不在发送窗口和发送缓冲区之内)、已发送但未收到确认的数据(位于发送窗口之内)、允许发送但尚未发送的数据(位于发送窗口之内)、发送窗口之外的缓冲区内暂时不允许发送的数据。

接收窗口中也有四个概念:已发送确认并交付主机的数据(不在接收窗口和接收缓冲区之内)、未按序收到的数据(位于接收窗口之内)、允许的数据(位于接收窗口之内)、不允许接收的数据(位于发送窗口之内)。
凡是已经发送过的数据,在未收到确认之前,都必须暂时保留,以便在超时重传时使用。只有当发送方A收到了接收方的确认报文段时,发送方窗口才可以向前滑动几个序号。当发送方A发送的数据经过一段时间没有收到确认(由超时计时器控制),就要使用回退N步协议,回到最后接收到确认号的地方,重新发送这部分数据。

4.1.4 拥塞控制

在某段时间内,若对网络中的某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变差,这种叫做拥塞。拥塞控制就是防止过多的数据注入到网络中,这样可以使网路中的路由器或链路不致于过载定义了四种拥塞控制算法:慢启动,拥塞避免、快速重传、快速恢复。
发送方会维护一个拥塞窗口cwnd,并且设置一个慢开始门限ssthresh。根据网络来进行动态的调整大小,网络拥塞的时候,路由器会丢弃报文,当发送方没有按时收到确认报文,那么就知道网络发生了拥堵。
在这里插入图片描述

慢启动:一开始将cwnd设置为1,发送报文段M1,如果收到确认M1,那么此时增大cwnd=2,并发送M2,M3。收到M2 M3的确认后,又将cwnd设置为4,依次进行下去(即cwnd指数增大),直到cwnd=ssthresh。
拥塞避免:当cwnd=ssthresh后,就会让cwnd线性增大(每次收到确认增加1,而不是加倍)。这就是拥塞避免算法。
如果当cwnd= x时,发出去的报文数丢失了若干(即<x),这时确认报文也会<x,一段时间后,丢失的报文段的重传计时器超时了,发送方判断可能出现拥塞,于是将ssthresh设置为x/2,将cwnd重新设置为1。并重新开始慢开始算法和拥塞避免算法。
快速重传:
在这里插入图片描述

快速恢复:快速恢复算法是在快速重传的前提下进行的,当发生快速重传后,会将ssthresh减半,由于发送方可能认为网络现在没有拥塞,因此与慢开始不同,把cwnd值设置为ssthresh减半之后的值,然后执行拥塞避免算法,线性增大cwnd。

4.2 用户数据报协议(UDP)

UDP是无连接不可靠的传输方式,但是正因为UDP协议的控制选项较少,在数据传输中延迟小、数据传输效率高,特别适合于可靠性要求不高的应用程序,比如视频、直播等。UDP也是被封装在IP数据报,UDP报文格式如下:

在这里插入图片描述
在这里插入图片描述

可知,UDP首部只有8个字节,而TCP首部至少有20个字节。16位UDP长度包含了UDP头部以及数据部分总长度,UDP检验和也包含了头部和数据部分。

5. 应用层

应用层为用户提供各种服务,服务一般通过知名端口号来识别。这些知名端口号由Internet号分配机构来管理,知名端口号位于1-255之间,256-1023端口号由Unix系统占用,1024-5000端口号可以由用户自行分配,大于5000的端口号是为其他服务器预留的。常见协议的端口号如下:

在这里插入图片描述

5.1 DHCP协议

DHCP(Dynamic Host Configuration Protocol),动态主机配置协议,是一个基于UDP协议的应用层协议,主要功能是当我们将客户主机ip地址设置为动态获取方式时,DHCP服务器就会根据DHCP协议给客户端分配IP、Gateway以及DNS服务器,使得客户机能够利用这个IP上网。DHCP协议有两个端口:67(服务器端),68(客户端)。

在这里插入图片描述

DHCP工作流程:
(1)DHCP Client以广播的方式发出DHCP Discover报文。
(2)所有的DHCP Server都能够接收到DHCP Client发送的DHCP Discover报文(因为广播),所有的DHCP Server都会给出响应,向DHCP Client发送一个DHCP Offer报文。
DHCP Offer报文中“Your(Client) IP Address(yiaddr)”字段就是DHCP Server能够提供给DHCP Client使用的IP地址,且DHCP Server会将自己的IP地址放在“option”字段中以便DHCP Client区分不同的DHCP Server。DHCP Server在发出此报文后会存在一个已分配IP地址的纪录。
(3)DHCP Client只能处理其中的一个DHCP Offer报文,一般的原则是DHCP Client处理最先收到的DHCP Offer报文。DHCP Client会发出一个广播的DHCP Request报文,在“选项”字段中会加入选中的DHCP Server的IP地址和需要的IP地址。
(4)DHCP Server收到DHCP Request报文后,判断选项字段中的IP地址是否与自己的地址相同。如果不相同,DHCP Server不做任何处理只清除相应IP地址分配记录;如果相同,DHCP Server就会向DHCP Client响应一个DHCP ACK报文,并在选项字段中增加IP地址的使用租期信息。
(5)DHCP Client接收到DHCP ACK报文后,检查DHCP Server分配的IP地址是否能够使用。如果可以使用,则DHCP Client成功获得IP地址并根据IP地址使用租期自动启动续延过程;如果DHCP Client发现分配的IP地址已经被使用,则DHCP Client向DHCP Server发出DHCP Decline报文,通知DHCP Server禁用这个IP地址,然后DHCP Client开始新的地址申请过程。
(6)DHCP Client在成功获取IP地址后,随时可以通过发送DHCP Release报文释放自己的IP地址,DHCP Server收到DHCP Release报文后,会回收相应的IP地址并重新分配。
在使用租期超过50%时刻处,DHCP Client会以单播形式向DHCP Server发送DHCP Request报文来续租IP地址。如果DHCP Client成功收到DHCP Server发送的DHCP ACK报文,则按相应时间延长IP地址租期;如果没有收到DHCP Server发送的DHCP ACK报文,则DHCP Client继续使用这个IP地址。
在使用租期超过87.5%时刻处,DHCP Client会以广播形式向DHCP Server发送DHCP Request报文来续租IP地址。如果DHCP Client成功收到DHCP Server发送的DHCP ACK报文,则按相应时间延长IP地址租期;如果没有收到DHCP Server发送的DHCP ACK报文,则DHCP Client继续使用这个IP地址,直到IP地址使用租期到期时,DHCP Client才会向DHCP Server发送DHCP Release报文来释放这个IP地址,并开始新的IP地址申请过程。
需要说明的是:DHCP客户端可以接收到多个DHCP服务器的DHCPOFFER数据包,然后可能接受任何一个DHCPOFFER数据包,但客户端通常只接受收到的第一个DHCPOFFER数据包。另外,DHCP服务器DHCPOFFER中指定的地址不一定为最终分配的地址,通常情况下,DHCP服务器会保留该地址直到客户端发出正式请求。
正式请求DHCP服务器分配地址DHCPREQUEST采用广播包,是为了让其它所有发送DHCPOFFER数据包的DHCP服务器也能够接收到该数据包,然后释放已经OFFER(预分配)给客户端的IP地址。
如果发送给DHCP客户端的地址已经被其他DHCP客户端使用,客户端会向服务器发送DHCPDECLINE信息包拒绝接受已经分配的地址信息。在协商过程中,如果DHCP客户端发送的REQUEST消息中的地址信息不正确,如客户端已经迁移到新的子网或者租约已经过期,DHCP服务器会发送DHCPNAK消息给DHCP客户 端,让客户端重新发起地址请求过程。

5.2 DNS域名协议

DNS域名系统也是基于UDP的一个协议,是互联网的一项业务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用UDP端口53,DNS报文分为请求和应答报文。

根据域名服务器所起到的作用,可以把域名服务器分为四种不同的类型。
在这里插入图片描述

DNS查询有两种方式,迭代查询和查询解析,如下图所示:

在这里插入图片描述
在这里插入图片描述

主机向本地域名服务器的查询一般都采用递归查询(recursive query)。所谓的递归查询就是:如果主机所询问的本地域名服务器不知道被查出来的域名的 IP 地址,那么本地域名服务器就以 DNS 客户的身份,向其他根域名服务器继续发出查询请求报文(替代该主机继续查询),而不是主机自己进行下一步的查询。因此,递归查询返回的结果要么是所查询的 IP 地址,要么报错,表示无法查到所需要的IP。
本地域名服务器向根域名服务器的查询方式通常采取迭代查询(iterative query)。迭代查询有以下的特点:当根域名服务器收到本地域名服务器发出的迭代查询请求报时,要么给出所要查询的 IP 地址,要么告诉本地域名服务器:“我这里没有你要的查询结果,你需要向哪一台域名服务器进行查询”。然后本地域名服务器进行后续的查询(不替代本地域名服务器)。
递归和迭代区别在于,递归时1个服务器只会查一次,没查到就交给下一个服务器往下查,查完后层层上报递归。而迭代的查询对象永远是当前服务器,被查的没查到,当前服务器就继续去查其他服务器。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值