一、传输层

传输层协议:

TCP:有连接,可靠传输,面向字节流,全双工

UDP:无连接,不可靠传输,面向数据报,全双工

连接:虚拟连接,双方保存对方信息

可靠传输:尽可能提高传输成功率,能感知到丢包;不可靠传输:只发送数据,不管其他

面向字节流:读写数据以字节为单位;面向数据报:读写数据以数据报为单位;

全双工:一个通信链路,支持双向通信(能读能写);半双工:一个通信链路,只支持单向通信(能读或者能写)

1.UDP

协议报文格式:

  • 长度:表示整个UDP数据报,长度(报头+载荷),长度属性是两个字节,表示范围是0-65535,64kb,当长度不足有两种方案 :                                                                                   1.应用层代码进行拆包处理,一个大的应用层广告数据包,拆分成为多个小包,使用多个UDP数据报传输     (工作量 较大,复杂)                                                                                  2.使用TCP协议,没有数据包限制长度(最优选择)
    • 校验和:验证数据是否发生修改,这里与HTTPS的数字签名不同,其是防止黑客篡改,这里UDP的校验和,为了防止由于光信号,电信号,电磁波等外界因素引起的比特翻转(1和0的转换)      验证方式:发送前算一次,把校验和和数据一起发送,收到后再算一次和之前的校验和比较          

2.TCP

报头:

1.16位的源端口,目的端口是传输层的核心内容

2.数据偏移(4位首长度):TCP 报头长度(可变(固定 20 字节 + 可选选项)),接收方通过该字段知道报头结束、数据开始的位置。

3.保留字段:TCP报头提前预留的位置,长度不够可以扩展

4.核心的6个标志位

TCP核心机制:

1.可靠性:网络通信非常复杂,TCP的可靠性可以尽可能使得数据被完整收到

完成可靠性的两个最核心机制:

1)确认应答

发送数据后,接收方返回一个应答报文(acknowledge, ack),发送方就知道对方收到数据了;应答报文会把标志位ACK改为1

触发问题:后发先至(发送多次数据,返回多次应答,但是由于网络路由不可靠,后发的数据的应答报文先到)

解决方案:

1.发送方编序号,发送方把TCP数据(1-1000字节)的第一个字节(1)存入到32位序号

2.接收方排序,接收方收到后在内核接收缓存区按照序号进行排序,保证应用层拿到完整有序的字节流

3.确认序号,返回应答报文时将最后一个字节加一(1001)存入到确认序号里面,表示小于1001数据已经收到,接下来从1001开始发送

4.当内核将N个tcp数据全部收到之后重组为字节流,最后read将数据给应用层读取。

2)超时重传

针对丢包问题的机制

因为网络结构非常复杂,当数据报经过某个路由器,交换机转发该路由器,交换机非常繁忙,超出转发能力上限,接受缓冲区都满了,而且数据包有时效性所有只能将这个数据报丢弃,但是丢包概率很低。

那发送方如何找到我发送的数据报丢包了?

引入超时时间,当过了时间上限没有收到ack,就可以认为丢包。

超时的时间不是固定的,当发生超时就会延长超时时间,但不是无限延长,超过一定程度就会认为网络严重故障,放弃这次传输。

没收到ack两情况:

1.发送的数据丢了

2.返回的ack丢了

那接收方会不会收到两次一模一样的数据?

不会,因为接收方收到后在内核接收缓存区按照序号进行排序,如果重复会丢弃

核心机制3:连接管理

连接:通信双方保存对方的信息

三次握手(建立连接)

A通过同步报文将自己的信息发给B,B再将自己的信息发给A同时一起发送应答报文ack表示自己收到了A的信息,提高了效率,最后A再发送一个应答报文ack,表示A收到了B的信息

三次握手的作用:

1.初步探测网络是否通畅

2.验证通信双方发送接收能力是否正常

3.三次握手可以协商一些关键信息,例如协商通信过程初始序号是多少,通过判断序号,第二次连接收到第一次连接的数据包可以通过序号区分出来,从而不进行处理。

四次挥手(断开连接)

与三次握手不同的是,三次握手一定是客户端发起的,但是四次挥手客户端和服务器都可以发起,

三次握手的syn和ack可以合并,但是四次挥手FIN和ack不能合并,因为内核收到FIN第一时间就返回ack,但是第二个FIN是由代码调用scoket.close才触发,两者可能时机不一致

主动发起的一方进入TIME_WAIT,被动一方进入CLOSED_WAIT

如果B给A返回一个FINA收到了,但是A返回的ACK丢包

A会等一定的时间(网络任何两个节点传输过程消耗最大的时间2*MSL)2

核心机制4:滑动窗口

滑动窗口可以在保证可靠性同时提高效率

滑动窗口中丢包:

1.数据报抵达但是ack丢了

数据1-1000的ack丢了,但是1001-2000的ack到了,返回的ack表明下一个是2001就不用在意之前丢的ack,后面的ack直接覆盖前面ack

2.数据包丢了

数据1001-2000没有收到,无论发什么数据,返回的ack都是表明下一个是1001,主机A就会进行快速重传,主机B收到后,确认序号就变成了7001,表示之前的数据都收到了,下一个从7001开始发送

快速重传:传输数据多使用,构成滑动窗口形式传输

超时重传:传输数据少使用,没有构成滑动窗口形式传输

以上措施表明虽然滑动窗口可以增加传输效率,但是依然是在可靠性的基础上

核心机制5:流量控制

滑动窗口,窗口大固然效率高,但窗口过大就会影响可靠性,因为接收方的处理能力是有限的

接受方将接收缓冲区的剩余空间大小填入窗口属性,发送方就通过这个数字重新设定发送窗口大小,即滑动窗口大小是动态变化的

窗口探测包:(探测缓冲区的大小)

核心机制6:拥塞控制

发送数据的时候不仅仅是接受方处理能力有限制,传输链路的转发能力也有限制

我们通过先按照小窗口发数据包,发送如果顺利不丢包就加大速度,出现丢包就减小速度,又不丢又加大速度,丢了又减小,实现动态平衡即拥塞控制。

滑动窗口大小拥塞控制和流量控制哪个值较小就按照哪个值进行发送

核心机制7:延时应答

默认情况下,都是接收到数据第一时间返回ack,但是也可以通过延迟ack的方式提高效率

不能一定提高效率,主要看应用程序消耗数据的速度

所有包都可以延时应答吗:no

  • 数量限制:每隔几个包,就延时应答一次(数据密集情况)
  • 时间限制:超过最大延迟时间就应答一次(数据稀疏情况)

核心机制8:捎带应答

普通模式:

1.服务器收到请求后先返回一个ack,确认收到了数据

2.服务器处理业务,生成响应数据,再单独发送一个包含响应的报文

基于上面的延时应答,可以引入捎带应答

ack被延迟发送后,正好要返回业务数据,就一起合成一个包(将ack设置为1,窗口大小设置为接收缓冲区剩余值,确认序号设置合适值...都是报头的内容,与响应数据不影响)返回客户端

核心机制9:面向字节流

粘包问题

通过字节流方式传输,会混淆包与包之间的边界,无法区分从哪里到哪里是一个完整的数据包

1.约定包与包之间的分隔符(包的结束标志)

在包的结尾加一个唯一不会出现在数据的分隔符\n

2.约定包的长度(包头+包体)

在包的最开头,用固定长度字节(如4个字节),记录包的总长度

核心机制10:异常情况处理

1.某个进程崩溃

进程崩溃和主动退出没有本质区别,进程释放(回收文件描述符表)

表的每个资源调用socket的close,FIN触发四次挥手,进程没了TCP连接还在,此时四次挥手正常进行。

2.主机关机

正常关机有一定的时间,这段时间会杀死所有用户进程,这时间正常可以进行完四次挥手

如果没有挥手完,会重传,也没有ACK,就会认为对面出现问题,B主动放弃与A的连接

3.主机掉电

A突然掉电B发过来的数据就没有ACK,对于B超时重传,继续重传不能解决问题,到一定次数,就会触发,重置TCP连接。即B发送一个复位报文RST,如果RST也没有ack,B就会单方面释放连接

B突然发现A没有发送数据,区分不了A具体是在休息还是挂了,就会发送一个特殊的报文“心跳包”,不携带业务数据(载荷),只是为了触发ACK,没有心跳,就认为对方挂了

4.网线断开

TCP机制的思路:可靠性出发->效率->可靠性->效率->特殊情况处理

其他标志位:

URG紧急指针位,TCP正常来说是按照序号发送和接收,相当于插队

PSH:催促标志位,发送方给接收方的数据带有这个标志位。接收方就会尽快将这个数据read到应用程序。

TCP和UDP对比:

TCP:可靠传输(大部分情况优先使用TCP)

UDP:效率更高(对性能要求高,可靠性要求不高)

二、网络层

IP协议

主要功能:

1.地址管理,使用IP地址,标识网络上的某个设备

2.路由选择,在两个通信节点之间,规划出一个合理的路径

IP数据报头部结构

4位版本IPv4,IPv6

4位首部长度IP协议的报头,也是变长,单位都是4字节

8位服务类型 :决定IP协议的工作方式,主要的四种工作方式,最小延时,最大吞吐量,最高可靠性,最小成本

16位总长度(字节数)

一个IP数据报(报头+载荷长度)

16位标识:

拆包:把拆出来的多个包,设置为相同标识

组包:把相同标识的数据包组合在一起

3位标识:

其中一个标志位,表示是否触发了拆包操作,还有一个表示,当前包是否是最后一个

13位片偏移:

描述先后顺序,偏移小的放在前面大的放在后面

8位服务类型:

4种主要服务类型,分别最小延时,最大吞吐量,最高可靠性,最小成本,这四者相互冲突,只能选择一个。

8位生存空间:

一个IP数据报,能够在网络传输的最大时间,次数为单位,每次经过一个路由器转发一次就减去1,减到0就说明包到不了,要丢弃

8位协议:

标识传输层使用哪种协议

16位首部校验和

仅校验 IP 头,数据部分的校验由 TCP/UDP 等上层协议负责;路由器转发时会重新计算该字段(因 TTL 变化)。

32位源IP地址,32位目的IP地址,最关键部分

地址管理-IP分配方式:

1.动态分配

上网分配,不上网就不分配

2.NAT机制(网络地址转换,最主要的方式 )

把IP分为两个大类

1.公网IP/外网IP

公网IP是唯一的

2.私网IP/内网IP

私网在不同局域网可以重复

机制:一个外网的IP可以对应局域网的所有设备,通过每个设备的不同的私网又可以区分具体的设备

NAT背景下,网络通信如何进行?

1.同一个局域网,设备A访问设备B,由于IP不允许重复,也不收到影响,NAT不起到作用

2.公网设备A访问公网设备B

由于公网IP本身也不重复,不受到影响,NAT不起作用

3.不同局域网,设备A访问设备B不允许

NAT机制禁止这样访问方式

4.局域网设备A访问公网B

5.公网设备A,不允许访问公网设备B

NAT路由器通过给每个内网连接分配唯一的公网端口,建立“公网IP:端口 ↔ 内网IP:端口”的映射表;服务器返回响应时,路由器就根据目标端口,把响应转发给正确的内网主机。

端口号是传输层(TCP/UDP)的核心标识,核心作用是:

  1. 区分同一主机上的不同应用进程:一台主机可以同时运行多个网络应用(如微信、浏览器、游戏),端口号用来标记数据属于哪个应用。
  2. NAT 场景下区分内网设备:在你刚才的 PAT(端口地址转换)场景中,路由器通过「公网 IP + 端口号」 的唯一组合,在收到服务器响应时,精准找到对应的内网设备和应用进程,完成数据转发。

IP地址其他规则

网段划分:把一个ip地址分为两个部分,前面部分为“网络号”,后半部分为“主机号”,且同一个就局域网中网络号必须相同,主机号必须不同,不同局域网中网络号必须不同,主机号无限制。

子网掩码:掩码的1对应IP地址部分属于网络号,掩码的0对应IP地址部分属于主机号,以此区分网络号与主机号。

特殊的IP地址:

  1. 主机地址全部设置为0,就成为了网络号,代表这个局域网
  2. 主机地址全部设置为1,就成为了广ip播地址,用于给同一个链路中相互连接的所有主机发送数据报。
  3. 127.*的ip地址用于本机环回测试,通常是127.0.0.1
  4. 实际组网中习惯以主机号为1的ip作为网关IP(网络的入口/出口)

路由选择-通过ip协议进行数据转发的过程

网络情况非常复杂,每个路由器不可能存储所有的网络信息,但是每个路由器可以存储附近的网络情况。

当数据包到达某个路由器,就会匹配这个路由器的路由表(记录这个路由器周围设备的ip以及记录每个设备从哪个口转发过去)

1.如果目的IP刚好匹配到路由表的记录,直接按照当前的对应口转发

2.如果没有找到,路由表有特殊选项“下一跳”,指向的设备为上一级路由器所在位置

三、数据链路层

以太网协议:

此处地址不是ip地址是mac地址(物理地址)

类型:类型不同,载荷数据格式不同

桢尾:校验和

载荷部分MTU(最大传输单元)是1500字节,而IP数据报理论最大长度为64kb,65536字节,所以因为数据链路层的限制对IP数据报进行拆包

ARP不是传输业务数据,而是辅助的网络层协议,可以根据下一跳的ip地址得到当前网络可用的mac地址,让数据能够传递出去。

IP+MAC+ARP 是怎么配合的?

前提信息

主机 A:IP 192.168.1.10,MAC AA:AA:AA:AA:AA:AA

路由器网关:IP 192.168.1.1,MAC GG:GG:GG:GG:GG:GG

外网服务器 C:IP 100.100.100.100,MAC CC:CC:CC:CC:CC:CC(在另一个网络里)

1.主机A构造ip数据包

源IP192.168.1.10目的IP100.100.100.100,主机A根据路由表,发现当前网段没有匹配的,所以选择下一跳路由器网关

2. 主机 A 发送ARP 数据报,拿到网关的 MAC 地址

发送ARP广播请求拿到GG:GG:GG:GG:GG:GG

3.主机A拿到mac地址成功构造以太网帧发送给网关

4.路由器网关去掉以太网头得到IP包,得到目的IP100.100.100.100,路由器查路由表,找到通往目标网段的下一跳地址。

5.路由器网关构造ip数据包,源IP192.168.1.1目的IP100.100.100.100

6.每经过一个路由器,进行三件事,拆帧看目的IP,查路由找下一跳,ARP拿下下一跳,ARP拿下MAC,重新封装帧发走

7.最后一台路由器网关发送ARP数据报,拿到服务器C的mac,发送ARP广播请求拿到CC:CC:CC:CC:CC:CC

8.路由器网关拿到mac地址成功构造以太网帧发送给服务器c

9. 服务器C收到数据,解封装后取出IP数据包,看到源IP是 192.168.1.10 ,然后按原路返回响应。

DNS

应用层协议,也可以认为是域名解析系统,把域名(一串单词),自动把这串单词,翻译成IP地址

1.最初DNS是通过hosts文件实现映射,但是hosts文件维护太复杂

2.访问某网站时候先访问DNS服务器找到域名对应的ip,再访问真正的服务器。

但是如果每次发送网络请求都要先访问DNS服务器,那DNS服务器会不会挂?

1.电脑进行一次DNS后就把ip存下来:缓存

2.DNS服务器不止一个,存储原始数据为根服务器,各种网络运营商,可搭建DNS镜像服务器。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐