您现在的位置是:首页 >技术杂谈 >网络原理——网络协议网站首页技术杂谈

网络原理——网络协议

patient-0525 2023-06-09 08:00:02
简介网络原理——网络协议

传输层协议


传输层负责数据能够从发送端传输接收端。传输层协议主要包含TCP协议和UDP协议。

TCP协议

TCP协议格式段

TCP协议格式段为:
在这里插入图片描述
各部分含义为:

源端口号(16位):标识发送方的端口号。
目的端口号(16位):标识接收方的端口号。
序列号(32位):用于标识发送的数据的顺序。
确认号(32位):用于确认接收到的数据。
数据偏移(4位):指示TCP报文头部的长度。
保留(6位):保留未来使用。
标志位(6位):

  • URG:优先发送该报文,不再按序发送。
  • ACK:确认应答。
  • PSH:立即推送报文,不再等缓冲区填满。
  • RST:对方要求重新建立连接;我们把携带RST标识的称为复位报文
  • SYN:请求建立连接;我们把携带SYN标识的称为同步报文
  • FIN:通知对方,本端要关闭了,我们称携带FIN标识的为结束报文

窗口大小(16位):指示接收方可接受的数据量。
校验和(16位):用于检测数据传输中的错误。
紧急指针(16位):仅在URG标志设置时有效,用于指示紧急数据的位置。
选项(可变长度):用于支持各种可选功能。

TCP原理

TCP协议的原则:保证数据传输安全的前提下,尽可能的提高传输效率。

连接管理

TCP协议使用三次握手建立连接,四次挥手断开连接。
三次握手:发送方请求连接(发送SYN,即同步报文)->接收方确认请求(收到请求后,发送ACK,即确认应答)->接收方请求连接(发送SYN)->发送方确认请求(收到请求后,发送ACK):
三次握手
这里接收方的两条指令因为间隔很短,两条指令会一起发送过去。因此接收方的ACK+SYN算作一次握手。
四次挥手:上述图中的SYN换成FIN(结束报文)即可。但是接收方的ACK和FIN指令一般不能合并,因此称为四次挥手。
为什么SYN与FIN不能合并?其主要原因在于接收方必须等到发送方关闭资源(也就是close)后才能发送FIN指令,假如close是立即执行的,那么FIN就可以和ACK合并,但是close可能要一会才能执行(或者根本不执行),那么FIN显然就不能和ACK合并,只能单独发送了。(FIN有可能与ACK合并的原因就在与TCP的延迟应答机制,TCP的ACK指令不会立即执行,而是稍微等待一会才执行。)
为什么需要三次握手?
三次握手是为了保证发送方和接收方的接受能力和发送能力都正常。假如A与B进行语音通话,A首先说话:“能听到吗?”,B此时听到了A说的话(代表B知道了A的麦正常,B的耳机正常),B回应:“能听到。”,B又说:“那你能听到我说的话吗?”,A能听到(说明A知道了A的麦正常,B的麦正常,A的耳机正常),但是A还要回应:“能听到”。(B知道了B的麦正常)。
在这里插入图片描述

可靠传输

TCP协议使用序列号和确认号来保证数据的有序传输和丢包重传,以实现可靠传输。每次传输都需要ACK确认应答,发送方收到了ACK,才能确定数据成功传输了过去,以此来保证数据传输的可靠性。假如发送方没有收到接收方的ACK,那么发送方就会认为此次数据传输是失败的,发送方就会重新传输一次——这依赖于TCP的超时重传机制:当超过最大等待时间后发送仍没有收到ACK,就进行数据重传。
当然,有两种情况会导致发送方没有收到ACK:发送方在发送途中丢包了(这种情况就只能超时重传了);接收方成功的收到了数据,但是返回的ACK没有传过去(这种情况就不能超时重传了)。
不过超时重传机制并不会考虑是否哪一种情况导致的未收到ACK,是因为TCP拥有自动去重功能,也就是传过去的数据只能接收一次,第二次传过去,接收方就不再接收了。
为了保证有序性,TCP为每个字节的数据都进行了编号,即为序列号。ACK是对接收到的数据的最高序号的确认,并返回下次期望接收到的序列号,从而保证数据的有序。

流量控制

TCP为了保证可靠传输,需要牺牲很多的效率。但是TCP协议的原则是:保证数据传输安全的前提下,尽可能的提高传输效率。如果按照一问一答的方式,假如一次传输1000个字节,就要等这1000个字节都传输到位,再接着传输1000个字节:
在这里插入图片描述
这种传输效率明显很低,要提高效率,可以采用一次传输多条数据的方式:
在这里插入图片描述
这样就可以有效地减少等待的时间了,但是一次同时传输多少条数据呢?在TCP协议报头中,有一个16位字段的窗口大小,就是滑动窗口,窗口的大小实际上是接收数据缓冲区的剩余大小。滑动窗口的大小就是每次传输的最大数据量。滑动窗口满了以后,发送ACK,并在缓冲区删除这条数据,这时缓冲区就会有剩余空间,发送端就可以接着传输数据。
接收端处理数据的速度是有限的。如果发送端发的太快,导致接收端的缓冲区被打满,这个时候如果发送端继续发送,就会造成丢包的情况。因此发送方传输数据的速度会根据滑动窗口的大小来动态调整,也就是流量控制
接收端会把当前缓冲区的大小放入TCP头部的窗口大小中,通过ACK来告知发送端窗口大小,发送端看到窗口较小时就会降低发送速度,相反会增大发送速度。假如缓冲区满了,返回的窗口大小就为0,此时发送端就会停止发送,但是会定期发送一个窗口探测数据段,使得接收端告知缓存区大小,一旦不满则继续发送。
当然,即使有了流量控制,也不能百分百的避免丢包的情况。
假如出现丢包情况怎么办?
如果是数据没有传过去,假如1~1000没有传过去,那么发送端会一直收到接收端的提醒:“下一个是1001”,直到接收到1~1000的数据返回ACK。多次提醒后发送方会重新发送1~1000这段数据。后面没有发生丢包的会正常接收,当1~1000这条数据重新发送且被收到后,接收方接收到了哪条数据,就返回哪条数据的下一个ACK,例如:1~1000丢了,后续数据正常传输,等到这条数据被接收后,已经接收到了5000条,这时ACK返回的就是:“下一个是5001”。
如果仅仅是ACK丢了,可以通过后续的ACK进行确认,不需要重新发送。

拥塞控制

在数据开始传输时,即使有了滑动窗口,也不能直接传输一大批数据,因为我们并不知道当前的网络拥堵情况,很可能当前的网络已经比较拥堵了,如果此时贸然地传输一大批数据,必然会造成大量的丢包现象。因此TCP引入了慢启动机制,先发送少量的数据,探测当前的网络情况,再逐步的增大传输速率。
这时就引入了拥塞窗口:拥塞窗口的大小根据网络拥塞情况动态变化。
它的变化分为几个阶段:慢启动、拥塞避免、快速重传、快速恢复。

  • 慢启动:主机开始发送数据时,首先探测一下网络的拥塞情况,即逐渐增大拥塞窗口。通常开始会把窗口大小设置为刚好容纳一个最大报文段MSS(Maximum Segment Size)的数值,每收到一个ACK,把拥塞窗口增加至多一个MSS的大小(每个报文段都会收到一个确认,因此每次窗口大小会翻倍),因此在前期,窗口大小会按照指数增长。
  • 拥塞避免:当拥塞窗口达到一定阈值(慢启动门限,ssthresh)后,就会进入拥塞避免阶段。在该阶段,拥塞窗口会线性增长,即每经过一次往返,只增加1个MSS大小。这样可以尽可能地达到网络拥塞的临界值。
  • 快速重传: 当发送方收到第三个重复的ACK时,就认为数据报丢失,会立即重传,而不用等待超时。快速重传把阈值设置为当前拥塞窗口的一半,同时把拥塞窗口置为1,接着进入慢启动阶段。
  • 快速恢复:当发送方收到第三个重复的ACK时,就认为数据报丢失,此时执行快速恢复算法:调整阈值的大小,将其设置为当前拥塞窗口的一半,把拥塞窗口设置为新的阈值加上3个MSS大小,然后重新发送数据报,在收到ACK后,重新进入拥塞避免阶段。
    拥塞窗口图解
    实际上,发生丢包时,会优先使用快速重传算法重传数据报,然后使用快速恢复算法调整拥塞窗口大小。
    每次发送的数据报,大小都不能超过拥塞窗口和接收方反馈的窗口大小的最小值。

延迟应答和捎带应答

为了保证滑动窗口尽可能大,ACK的确认应答采用了延迟应答。假如我们往缓冲区放了1k个字节,如果立即ACK,那么这1k个字节的空间就用不了了,如果稍微等一下,这1k个字节可能就被处理掉了,此时返回的窗口大小就更大了。基于延迟应答机制,像上述的断开连接四次挥手就有可能变为三次挥手。(ACK延迟应答,而close正好在这期间执行完毕,因此FIN可以和ACK一起应答,即捎带应答

错误检测

TCP协议使用校验和来检测数据报的传输过程中是否出现错误。发送数据报之前,发送方首先计算数据报的校验和,并存储在报文的校验和字段中,接收方接收数据后,会重新计算校验和,并与TCP报文中的校验和进行比较,如果校验和不同,说明传输出现了错位。

TCP异常

非正常断开连接中,进程终止和机器重启不会造成TCP断开连接异常,结束时仍然会正常发送FIN,(FIN是由传输层控制的,与进程无关),假如收到FIN后没来得及ACK就关机了,此时,接收端会尝试重发FIN,重发几次后会充值连接,还不行的话就断开连接。
但是假如发生了断电或断网的情况,发送端来不及发送FIN报文,因此接收方认为连接还在。但是TCP有一个心跳包保活机制,会定期的询问对端是否还在,如果对端不在,就会断开连接。

UDP协议

UDP协议较TCP简单很多,其主要优点是传输速度块。

UDP协议格式段

UDP协议格式段

UDP协议特点

无连接

基于UDP协议的传输不需要连接,只需要知道对端的IP和端口号就可以传输。

不可靠

UDP传输不考虑对方是否收到,因此可以一次性发送大批数据。当然如果发生了丢包问题等,UDP没有相应的补救措施。

面向数据报

UDP每次传输和接收必须以一个数据报的形式接收和发送,假如这个数据报中有100个字节,读取时一次就只能读取100个字节而不能1个一个读或者10个10个读。

大小受限

UDP每次传输的数据大小最大是64k,如果传输的数据大于64k,最常用的方法是在应用层进行分离和组装(拆分成小于64k的大小);或者按大包的形式发,在数据链路层再进行分包和组包。

网络层协议

网络层协议主要是IP协议,作用是确定网络传输的路径。

IP协议

IP协议格式段
IP协议格式段
版本:用来标识IP的版本号,目前有IPV4和IPV6两个版本。
首部长度:用来表示IP协议的头部长度。大小为4个字节,一个字节表示的最大数为1111(即15),所以首部长度最大值是60个字节。最常用的首部长度是20个字节。
服务类型:用来获取更好的服务。由三位优先权字段(已弃用),四位TOS位,和0组成。4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。这四者互相冲突,只能从中选择一个。

服务类型(Type of Service)字段实际上从未使用过。1988年IETF把这个字段改名为区分服务(Differentiated Services),并对其重定义:把前六位定义成DSCP(Differentiated Services Code Point),后两位保留。因此该字段现在通常称为DS字段。

数据报总长度:IP数据报整体占用字节数。
标识符:唯一地标识主机发送的报文。假如要发送的报文长度大于数据链路层支持的最大长度,即超过最大传输单元(MTU)(如果是以太网则为1500个字节),则报文就需要被分割成几部分再进行传输,这些被分割的部分都带有相同的标识符(id),表示这是一个报文。
标志位:第一位保留后用;第二位表示该包是否允许分片(1表示不允许此时如果该包长度大于最大传输单元,将该包丢弃,同时返回发送者ICMP错误);第三位表示是否为最后一个分片,如果是则为1。
片位移:也叫偏移量。当IP分片以后,各个部分传输的时间并不相同,有可能后发先至,因此每个分片的偏移量都不相同,最后根据偏移量对包进行重组。(与TCP原理类似)
生存时间:表示到达目的地最多要经过的节点个数(TTL,一般是64),每经过一个节点(路由器),TTL-1,TTL为0时还没到达目的地,就认为路由寻址出现了问题(可能出现了死循环),此时会丢弃该报文,并通知发送方。
协议:用来表示上层协议类型。
校验和:校检IP协议头部,判断运输是否正常。
源IP:32位,表示数据报源IP。
目的IP:32位,表示数据报目的IP。
选项:可选字段,可以更改一些可选的报头格式,如果更改首部长度,需要保证长度为4的倍数。

数据链路层协议

数据链路层最常用的协议是Etnernet以太网协议

​以太网

以太网是一种计算机局域网技术,它规定了包括物理层的一些内容,以太网是应用最普遍的局域网技术。
以太网帧格式
以太网帧格式
源mac地址和目的mac地址表示的是网卡硬件地址,(物理地址,该地址跟随网卡出厂就设定好了,不可更改)用来表示每段传输的起点和终点。
帧协议类型字段有三种值:分别对应IP、ARP、RARP;
CRC:校验和,检验传输是否正常。

MTU

MTU,即Maximum Transmission Unit,意为最大传输单元。不同的数据链路层协议MTU不相同,以太网的MTU为1500个字节。
MTU的作用是限制每次传输数据报的大小,MTU会影响上层协议的传输。

ARP协议

ARP协议建立了IP与mac的映射关系。每次传输时通过IP地址在本地ARP缓存表中查找目的mac地址,如果找到了,直接传输到目的mac地址即可,如果没有找到,则进行广播查找目的mac地址。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。