IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 万字网络助你拿到大厂offer! -> 正文阅读

[网络协议]万字网络助你拿到大厂offer!

网络基础

OSI七层模型

计算机网络从逻辑上被分成了七层,每一层都有其对应的物理硬件设备。作为一种框架性的设计方法,其优点是将服务、接口和协议这三个概念区分出来,使得不同的系统和不同的网络之间通过这七个层次化的结构模型实现可靠的通讯传输。但是具体的落地实现采用的是TCP/IP的四层概念模型进行实现。

  • 应用层

    • 应用层(Application Layer)是OSI参考模型的最高层,它是计算机用户,以及各种应用程序和网络之间的接口,其功能是直接向用户提供服务,完成用户希望在网络上完成的各种工作。
  • 表示层(未实现)

    • 表示传输数据的类型;对来自应用层的命令和数据进行解释,对各种语法赋予相应的含义,并按照一定的格式传送给会话层。为了减少数据的传输量,这一层还负责数据的压缩与恢复。
  • 会话层(未实现)

    • 是用户应用程序和网络之间的接口,主要任务是:向两个实体的表示层提供建立和使用连接的方法。将不同实体之间的表示层的连接称为会话。因此会话层的任务就是组织和协调两个会话进程之间的通信,并对数据交换进行管理。允许用户在两个实体设备之间建立、维持和终止会话,并支持它们之间的数据交换。
  • 传输层

    • OSI下3层的主要任务是数据通信,上3层的任务是数据处理。向用户提供可靠的端到端的差错和流量控制,保证报文的正确传输。传输层的作用是向高层屏蔽下层数据通信的细节,即向用户透明地传送报文。该层常见的协议:TCP/IP中的TCP协议、Novell网络中的SPX协议和微软的NetBIOS/NetBEUI协议。
  • 网络层

    • 它是OSI参考模型中最复杂的一层,也是通信子网的最高一层。它在下两层的基础上向资源子网提供服务。其主要任务是:通过路由选择算法,为报文或分组通过通信子网选择最适当的路径。该层控制数据链路层与传输层之间的信息转发,建立、维持和终止网络的连接。具体地说,数据链路层的数据在这一层被转换为数据包,然后通过路径选择、分段组合、顺序、进/出路由等控制,将信息从一个网络设备传送到另一个网络设备。
  • 数据链路层

    • 负责建立和管理节点间的链路。该层的主要功能是:通过各种控制协议,将有差错的物理信道变为无差错的、能可靠传输数据帧的数据链路。
      在计算机网络中由于各种干扰的存在,物理链路是不可靠的。因此,这一层的主要功能是在物理层提供的比特流的基础上,通过差错控制、流量控制方法,使有差错的物理线路变为无差错的数据链路,即提供可靠的通过物理介质传输数据的方法。
  • 物理层

    • 物理层(Physical Layer)是参考模型的最低层,也是OSI模型的第一层。
      物理层的主要功能是:利用传输介质为数据链路层提供物理连接,实现比特流的透明传输。
      物理层的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异。使其上面的数据链路层不必考虑网络的具体传输介质是什么。

image-20210802164937214

封装分用

封装分用是两个截然相反的过程,封装是指发送方将数据按照预定的不同层次的协议进行自上而下的层层封装,然后传输给接收方,而分用是指接收方将接收到的数据和协议的结合体进行自下而上的层层解封,最后获得数据的过程。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9bp1Rfeh-1628148849933)(…/…/AppData/Roaming/Typora/typora-user-images/image-20210803193806145.png)]

封装过程,就是在数据的头部或者尾部加上协议头,然后传递给下一层。

image-20210803194811521

这是网上一张清一色的封装分用的图,确实好用,大家都用这张图来表达自己对封装过程的理解,那我就通过解析这张图片来表达我对封装过程的理解。

封装过程是自顶向下的,首先是应用层封装。应用层的封装遵循的是应用程序的协议。图中采用的封装方法是设置Appl首部,这个首部可以包含的内容,可以是发送数据的长度,然后接受方在获取到这个头部后根据这个数据长度来接受后面的数据;也还有另外的一种方法,就是类似http协议,在数据结尾加上结束标志,接受方读取到结束标志位时就说名数据的传输完成了!

接下来的每一层都是类似的,在上一层的协议之上,我们再加上本层的协议,传输层封装成一个TCP段(UDP段),交给网络层封装,一次类推。最终在数据链路层封装成以太网帧,至此封装完成。

image-20210803201815723

而分用的就是封装的逆过程,值得注意的是,这个逆过程并不是那么简单。

因为IP协议、ARP协议和RARP协议都使用帧传输数据,所以帧的头部需要提供某个字段(具体情况取决于帧的类型)来区分它们。

同样,ICMP协议、TCP协议和UDP协议都使用IP协议,所以IP数据报的头部采用16位的协议字段来区分它们。

TCP报文段和UDP数据报则通过其头部的16位端口号(port number)字段来区分上层应用程序。(例如:DNS协议对应的端口号是53,HTTP协议对应的端口是80).
通俗来讲,因为在封装的过程中,由于在同一层中有多种不同的协议,为了在分用的时候知道即将分用的下一层使用的是什么协议进行封装的,所以,需要在封装过程中的下一层的头部添加一个协议字段来标记区分他们。

应用层

http协议

HTTP是一个无状态的超文本传输协议。

主机名:localhost.com
端口:8080
对象路径:/index.htm 

Set-Cookie的字段属性:

NAME=VALUE:赋予Cookie的名称和值;
expires=DATE: Cookie的有效期;
path=PATH: 将服务器上的目录作为Cookie的适用对象,若不指定,则默认为文档所在的文件目录;
domin=域名:作为Cookies适用对象的域名,若不指定,则默认为创建Cookie的服务器域名;
Secure: 仅在HTTPS安全通信是才会发送Cookie;
HttpOnly: 使Cookie不能被JS脚本访问;

GET 请求的一些特性:
  • GET 请求可被缓存
  • GET 请求保留在浏览器历史记录中
  • GET 请求可被收藏为书签
  • GET 请求不应在处理敏感数据时使用
  • GET 请求有长度限制
  • GET 请求只应当用于取回数据(不修改)
POST 请求的特性:
  • POST 请求不会被缓存
  • POST 请求不会保留在浏览器历史记录中
  • POST 不能被收藏为书签
  • POST 请求对数据长度没有要求
浏览器发出的POST请求的body的主要格式
  • application/x-www-form-urlencoded 用来传输简单的数据,如 “key1=value1&key2=value2” 这样的格式。
  • multipart/form-data 主要用来传输文件内容。
  • application/json 告诉服务端消息主体是序列化后的 JSON 字符串。
  • text/plain 纯文本格式
HTTP应答状态码
状态码类别描述
1xxInformational(信息性状态码)请求正在被处理
2xxSuccess(成功状态码)请求处理成功
3xxRedirection(重定向状态码)需要进行重定向
4xxClient Error(客户端状态码)服务器无法处理请求
5xxServer Error(服务端状态码)服务器处理请求时出错
HTTP缺点
  • 通信使用明文,可能被窃听
  • 不验证通信方的身份,可能遭遇伪装
  • 无法证明报文的完整性,有可能遭遇篡改

相信大家对http都已经烂熟于心,就不再过多的赘述了!

https协议

HTTP协议采用明文传输信息,存在信息窃听、信息篡改和信息劫持的风险,而协议TLS/SSL具有身份验证、信息加密和完整性校验的功能,可以避免此类问题发生。

image-20210804222914347

https加密原理

加密类型

加密算法可以分为对称加密和非对称加密:

  • **对称加密:**双方使用的同一个密钥,既可以加密又可以解密,这种加密方法称为对称加密,也称为单密钥加密。
    • **AES加密算法:**秘钥的长度可以是128、192、256位;
    • **DES算法:**秘钥的长度是64位,8个字节;分组加密(将数据分成固定长度的数据块,速度快,适合对大量数据加密)
    • **3DES算法:**在DES的基础上,用三个不同的秘钥进行三次加密提高密文强度。
    • **RC2和 RC4:**用变长密钥对大量数据进行加密,比 DES 快;

**优点:**速度快,对称性加密通常在消息发送方需要加密大量数据时使用,算法公开、计算量小、加密速度快、加密效率高。

**缺点:**在数据传送前,发送方和接收方必须商定好秘钥,然后 使双方都能保存好秘钥。其次如果一方的秘钥被泄露,那么加密信息也就不安全了。

  • **非对称加密:**一对密钥由公钥和私钥组成(可以使用很多对密钥)。私钥解密公钥加密数据,公钥解密私钥加密数据(私钥公钥可以互相加密解密)。例如,RSA、Elgamal、背包算法、DSA、ECC(椭圆曲线加密算法)。
    • **RSA算法:**生成一对公钥私钥,相互加密解密;它的安全程度取决于秘钥的长度,目前主流可选秘钥长度为 1024位、2048位、4096位等。
    • **DSA算法:**和 RSA 不同的是 DSA 仅能用于数字签名,不能进行数据加密解密,其安全性和RSA相当,但其性能要比RSA快。

使用最广泛的是RSA算法,Elgamal是另一种常用的非对称加密算法。

**缺点:**速度较慢

**优点:**安全

也可以分为单向加密和双向加密:

单项加密就是加密后不可解,而双向加密就是加密后可解;比如一些签名算法就是单项加密算法:

MD5:常用于校验数据的完整性、数据(消息)摘要、数据加密等;

SHA1:SHA算法系列是中数据摘要算法,由于数据摘要比较长,比起md5,其运算速度更慢。SHA1主要应用于CA和数字证书中,另外在互联网中流行的BT软件中,也是使用SHA1来进行文件校验的。

数字证书

在建立https连接的之前,客户端需要对服务端进行身份验证,确定公钥的获取途径是合法的,需要引入第三方机构CA,CA负责核实拥有者的身份信息,并颁发证书。基本原理是对关键信息用私钥加密,并且将公钥公开发布。这样客户端就可以用公钥验证签名。

CA证书一般会包括:颁发机构,版本,使用者,公钥,有效时间,数字签名hash值和签名hash算法等。

客户端如何校验CA证书?

客户端用公钥解密证书中用私钥加密的hash值,得到一个hash-a;然后再利用证书内的签名h6666666666666666666666666ash算法生成一个hash-b,如果这两个值相等,那么就证书是正确的。服务端可以信任,否则,浏览器就会给出相应的提示。当然,校验过程不仅是校验(数字签名)hash值,还会校验有效时间,域名匹配等等。

详细讲解ssl握手过程:
  1. 首先,客户端访问服务端的时候会生成一个随机数1,然后把随机数和支持的ssl版本号以及加密算法等信息发送个服务端。

  2. 服务端B接收到这些信息后,首先确认一下双方的加密算法,然后服务端也生成一个随机数2,然后将随机数2和CA机构颁发的证书一起返回给客户端。

  3. 客户端得到CA证书后,回去校验CA证书的有效性,校验通过后,客户端再生成一个随机数3用公钥加密并传输给服务端。

  4. 服务端得到加密后的随机数3密文,然后利用私钥进行解密,得到明文随机数3.

  5. 最后客户端和服务端都同时有了随机数1,2,3然后双方都利用这三个随机数生成一个对称的对话秘钥。之后传输的内容通过这个秘钥进行加密解密,也就是对称加密。一般运用得是AES算法。

  6. 客户端会再通知服务端后面的通讯用该对称秘钥传输,并且告诉他自己的握手过程结束。

  7. 服务端也会通知客户端后面会用这个对称秘钥传输,然后告诉他握手结束。

  8. 可以开始传输数据了。

数字签名

在数据的传输过程中,如果黑客不能拿到传输的实际数据,他们就会想其他的办法,比如,可以篡改其中的内容或者是伪造一份数据发送给接收方,这样带来的损失可能是不可估量的。为了防止这样的情况发生,就有了数字签名。所谓数字签名就是发送方将发送的数据通过单项加密算法记性加密,然后同发送的数据一起发送给接收方,接收方拿到数据后,用相应的加密算法对数据进行加密,判断和数字签名的值是否相等,如果不相等就说明被篡改了,于是就可以及时发现,提出解决办法。

这里注意,在黑客解不开加密的真实数据的时候,他肯定是不能伪造这个数字签名的,因为他不知道明文,怎么能伪造数字签名呢?

数字证书到底有什么用?

有人觉得,非对称加密中,数字证书可以是多余的,用数字签名就可以保证数据不被篡改!而且凭借非对称加密的安全性,可以高枕无忧!其实不然!

假设不用数字证书进行验证。在服务端再传输公钥给客户端的时候,黑客劫持了这一数据,发现是服务端传输的公钥,这时候他将自己生成的公钥发送给了客户端,自己就保持着自己拥有的私钥。这样,一旦服务端发送数据过来,就会被黑客劫持,然后解密其中的内容,紧接着,他就用自己的私钥将生成另外一段和这个内容相关但是不正确的密文发送给你,而你持有的是黑客的公钥,也就顺理成章的解开了他发送的密文,也就成功的上套了!

从上面的分析来看,数字证书的存在就是为了验证公钥是否可靠,服务端是否值得信任。

那么又有人问了,数字证书有没有可能被伪造或者篡改呢?

要知道,CA证书中包含CA的数字签名,并且用私钥对证书的摘要进行加密的,而证书是公开的,即便篡改证书的内容,但是签名是无法伪造的,客户端也能及时发现证书已经被篡改了!

DNS协议

DNS 是一个应用层协议,域名系统 (DNS) 的作用是将人类可读的域名 (如,www.example.com) 转换为机器可读的 IP 地址 (如,192.0.2.44)。DNS 协议建立在 UDP 或 TCP 协议之上,默认使用 53 号端口。客户端默认通过 UDP 协议进行通讯,但是由于广域网中不适合传输过大的 UDP 数据包,因此规定当报文长度超过了 512 字节时,应转换为使用 TCP 协议进行数据传输。

主机名到 IP 地址的映射有两种方式:

  • 静态映射 - 在本机上配置域名和 IP 的映射,旨在本机上使用。Windows 和 Linux 的 hosts 文件中的内容就属于静态映射。
  • 动态映射 - 建立一套域名解析系统(DNS),只在专门的 DNS 服务器上配置主机到 IP 地址的映射,网络上需要使用主机名通信的设备,首先需要到 DNS 服务器查询主机所对应的 IP 地址。

DNS解析过程

1、主机m.abc.com先向本地服务器dns.xyz.com进行递归查询。

2、本地服务器采用迭代查询。它先向一个根域名服务器查询。

3、根域名服务器告诉本地服务器,下一次应查询的顶级域名服务器dns.com的IP地址。

4、本地域名服务器向顶级域名服务器dns.com进行查询。

5、顶级域名服务器dns.com告诉本地域名服务器,下一步应查询的权限服务器dns.abc.com的IP地址。

6、本地域名服务器向权限域名服务器dns.abc.com进行查询。

7、权限域名服务器dns.abc.com告诉本地域名服务器,所查询的主机的IP地址。

8、本地域名服务器最后把查询结果告诉m.xyz.com。

NAT

NAT ( Network Address Translation ) 中文意思是"网络地址转换",允许一个整体机构以一个公用IP(Internet Protocol)地址出现在Internet上。顾名思义,它是一种把内部私有网络地址(IP地址)翻译成合法网络IP地址的技术。NAT 可以让那些使用私有地址的内部网络连接到Internet或其它IP网络上。NAT路由器在将内部网络的数据包发送到公用网络时,在IP包的报头把私有地址转换成合法的IP地址。

NAT有三种类型:

  1. 静态 NAT一对一)。将内部网络的私有IP地址 为公有IP地址,IP地址对是一对一的,是一直不变的。
  2. 动态地址 NAT (多对多)。将内部网络的私有 IP 地址转换为公用 IP 地址时,IP 地址是不确定,随机的。所有被授权访问 Internet 的私有 IP 地址可随机转换为任何指定合法的 IP 地址。也就是说,只要指定哪些内部地址可以进行转换,以及用哪些合法地址作为外部地址时,就可以进行动态 NAT 转换。动态 NAT 是在路由器上配置一个外网 IP 地址池,当内部有计算机需要和外部通信时,就从地址池里动态的取出一个外网 IP,并将他们的对应关系绑定到 NAT 表中,通信结束后,这个外网 IP 才被释放,可供其他内部 IP 地址转换使用,这个 DHCP 租约 IP 有相似之处。
  3. 网络地址端口转换 NAPT( 多对一 )。改变外出数据包的源端口并进行端口转换,采用端口多路复用方式。内部网络的所有主机均可共享一个合法外部 IP 地址实现对 Internet 的访问,可以最大限度地节约 IP 地址资源。同时,也可以隐藏网络内部的所有主机,有效避免来自 Internet 的攻击。因此,目前网络中应用最多的就是 PAT 规则。这是最常用的 NAT 技术,也是 IPv4 能够维持到今天的最重要的原因之一,它提供了一种多对一的方式,对多个内网 IP 地址,边界路由可以给他们分配一个外网 IP,利用这个外网 IP 的不同端口和外部进行通信。NAPT 与 动态NAT 不同,它将内部连接映射到外部网络中的一个单独的 IP 地址上,同时在该地址上加上一个由 NAT 设备选定的端口号。

NATP的转换过程

  1. 客户机将数据包发给运行NAT的计算机。
  2. NAT主机将数据包中的源端口号和源私有IP地址转换成自己的端口号和公网的IP地址,然后将数据包发给外部网络的目的主机。
  3. NAT主机记录一条跟踪信息在地址转换映像表中,以便向客户机发送响应信息。
  4. 外部网络发送回送信息给NAT主机。
  5. NAT主机根据映像表中的记录,将所收到数据包的端口号和公用IP地址转换成目标主机的端口号和内部网络中目标主机的专用IP地址,并转发给目标主机。

传输层

TCP/IP协议

五元组:

  • 协议号:约定的数据格式

  • 源IP:发送数据的主机

  • 源port:发送数据的进程

  • 目的IP: 接收数据的主机

  • 目的port: 接收数据的进程

    总结:ip对应网络中的每个主机,而port对应着每台主机中的应用程序。

image-20210803221233794

UDP

image-20210803221513679

特点:
  • 无连接,不可靠。
  • 面向数据报,发送和接收只能一次完成。
  • 有接收缓冲区,没有发送缓冲区(发送方不关心是否接收到)
  • 发送的最大数据64k,超过需要在应用层手动分层,多次发送,接收方手动拼装。
UDP应用场景:

1.面向数据报方式
2.网络数据大多为短消息
3.拥有大量Client
4.对数据安全性无特殊要求
5.网络负担非常重,但对响应速度要求高

基于UDP的应用层协议:
NFS:网络文件系统
TFTP:简单文件传输协议
DHCP:动态主机配置协议
BOOTP:启动协议
DNS:域名解析协议
用udp实现可靠传输?
传输层无法保证数据的可靠传输,只能通过应用层来实现了。实现的方式可以参照tcp可靠性传输的方式,只是实现不在传输层,实现转移到了应用层。
最简单的方式是在应用层模仿传输层TCP的可靠性传输。在不考虑拥塞处理的情况下,可靠UDP的简单设计。
1、添加seq/ack机制,确保数据发送到对端
2、添加发送和接收缓冲区,主要是用户超时重传。
3、添加超时重传机制。
UDP编程的服务器端一般步骤是:

1、创建一个socket,用函数socket();
 2、设置socket属性,用函数setsockopt();* 可选
 3、绑定IP地址、端口等信息到socket上,用函数bind();
 4、循环接收数据,用函数recvfrom();
 5、关闭网络连接;

UDP编程的客户端一般步骤是:

1、创建一个socket,用函数socket();
 2、设置socket属性,用函数setsockopt();* 可选
 3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选
 4、设置对方的IP地址和端口等属性;
 5、发送数据,用函数sendto();
 6、关闭网络连接;

TCP

TCP协议格式

image-20210803221549052

16位源端口号:16位的源端口中包含初始化通信的端口。源端口和源IP地址的作用是标识报文的返回地址。

16位目的端口号:16位的目的端口域定义传输的目的。这个端口指明报文接收计算机上的应用程序地址接口。

32位序号:32位的序列号由接收端计算机使用,重新分段的报文成最初形式。当SYN出现,序列码实际上是初始序列码,而第一个数据字节是ISN+1。这个序列号(序列码)可用来补偿传输中的不一致。

32位确认序号:32位的序列号由接收端计算机使用,重组分段的报文成最初形式。如果设置了ACK控制位,这个值表示一个准备接收的包的序列码。

4位首部长度:4位包括TCP头大小,指示何处数据开始。

保留(6位):6位值域,这些位必须是0。为了将来定义新的用途而保留。

6位标志域表示为:紧急标志、有意义的应答标志、推、重置连接标志、同步序列号标志、完成发送数据标志。按照顺序排列是:URG、ACK、PSH、RST、SYN、FIN。

6位窗口大小:用来表示想收到的每个TCP数据段的大小。TCP的流量控制由连接的每一端通过声明的窗口大小来提供。窗口大小为字节数,起始于确认序号字段指明的值,这个值是接收端正期望接收的字节。窗口大小是一个16字节字段,因而窗口大小最大为65535字节。

16位校验和:16位TCP头。源机器基于数据内容计算一个数值,j接收信息方要与源机器数值 结果完全一样,从而证明数据的有效性。检验和覆盖了整个的TCP报文段:这是一个强制性的字段,一定是由发送端计算和存储,并由接收端进行验证的。

16位紧急指针:指向后面是优先数据的字节,在URG标志设置了时才有效。如果URG标志没有被设置,紧急域作为填充。加快处理标示为紧急的数据段。

选项:长度不定,但长度必须为1个字节。如果没有选项就表示这个1字节的域等于0。

tcp安全机制

确认应答机制

经过三次握手建立连接之后,客户端和服务端都进入了数据传输状态。TCP协议需要在不可靠的信道上保证可靠的连接,现在面临的问题:(一包数据可能会被拆成多包发送,如何处理丢包问题;这些数据包到达的先后顺序不同,如何处理乱序问题),针对这些问题,TCP协议建立了一个发送缓冲区,从建立链接后的第一个字节的序列号为0,后面每个字节的序列号就会增加1。发送数据时,从发送缓冲区取一部分数据组成发送报文,在其TCP协议头中会附带序列号和长度,接收端在接收到数据后要回复确认报文,确认报文中的ACK等于接收序列号加长度=下一包的起始序列号,也就是下一包需要发送的起始序列号。这样一问一答的方式能确认使发送端确认发送的数据已经被对方收到。发送端也可以一次性发送连续的多包数据,接收端只需要回复一次ACK就可以了。这样发送端可以把待发送的数据分割成一系列的碎片发送到对端,对端根据序列号和长度在接收后重构出来完整的数据。

image-20210803230124628

超时重传机制

如上图,如果在传输过程中出现了丢包现象,比如丢包的是100-199,接收端就会给发送方发送ack=100的数据报。接收端就会进行重发补齐。

那么如何判定超时呢?受网络带宽的影响,该时间会动态计算得到。设置一个底数时间,每次重发都会将底数翻倍,达到一定次数就会关闭连接!

最后,还有一种可能就是重复发送,这个很好解决,通过序列号就可以排除重复数据包!!

流量控制

通过tcp头部的窗口大小来实现。

接收方将自己的缓冲区大小放在窗口大小中,告诉发送端,窗口的字段越大就说明网络的吞吐量越大,发送的速度就越大;如果接收方发现缓冲区的快满了,就将窗口大小的值设置的很小,发送发接收到后就减小发送速度;这样就能实现流量的控制。如果缓冲区满了,窗口大小就直接设置为0;然后发送端收到后就不再发送数据,但是会定期发送窗口探测,以便检测接收方是否能接收数据。

拥塞控制

发送端会首先发送少量的数据去探测网络拥堵状况,之后会根据实际状况决定发送数据的速度。这里通过拥塞窗口大小来标识发送端的网络状态。

tcp连接机制(三次握手,四次挥手)

三次握手过程
  • 第一次握手:建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。

  • 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;

  • 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
    image-20210803233815415

面试题: 为什么要三次握手而不是两次握手?

? 服务端回复完SYN+ACK之后就建立连接,这是为了防止因为已失效的请求报文,突然又传到服务器而引起错误。

? 假设采用两次握手建立连接,客户端相关服务端发送了一个SYN包请求建立连接,因为某些未知原因,并没有到达服务器,在中间某个网络节点产生了滞留,为了建立连接客户端会重新发送SYN包,这次正常送达,服务端会回复SYN+ACK,之后建立连接。但第一包数据阻塞的网络节点,突然恢复,第一包SYN包又送达到服务端,这时服务端会认为客户端又发起了一个新的连接,从而在两次握手之后进入等待数据状态,服务端认为是两个连接,而客户端认为是一个连接,造成状态不一致。

如果在三次握手的情况下,服务端收不到最后的ACK包,自然不会认为连接建立成功,所以三次握手本质上来说,就是为了解决网络信道不可靠的问题,为了能够在不可靠的信道上建立可靠的连接。

面试题:如果连接建立后客户端异常了怎么办?

TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

四次挥手过程

1)客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
2)服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
3)客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
4)服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
5)客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2??MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
6)服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。

面试题:为什么客户端需要等待超时时间?

这是为了保证对方已经收到ACK包,因为假设客户端发送完最后一包ACK包就释放了连接。一旦ACK包在网络中丢失,服务端将一直停留在最后确认状态LAST-ACK。如果客户端发送最后一包ACK包后,等待一段时间,这时服务端因为没有收到ACK包会重发FIN包,客户端会响应这个FIN包,重发ACK包并且刷新超时时间。

四次挥手也是为了保证在不可靠的网络链路中进行可靠的连接断开、确认。

tcp的效率机制

滑动窗口
  属于TCP协议的一种应用,用于网络数据传输时的流量控制,并发的发送数据报,提高网络的传输速率,以避免拥塞的发生。该协议允许发送方在停止并等待确认前发送多个数据分组。由于发送方不必每发一个分组就停下来等待确认,因此该协议可以加速数据的传输,提高网络吞吐量。

TCP并不是每一个报文段都会回复ACK的,可能会对两个报文段发送一个ACK,也可能会对多个报文段发送1个ACK【累计ACK】,比如说发送方有1/2/3 3个报文段,先发送了2,3 两个报文段,但是接收方期望收到1报文段,这个时候2,3报文段就只能放在缓存中等待报文1的空洞被填上,如果报文1,一直不来,报文2/3也将被丢弃,如果报文1来了,那么会发送一个ACK对这3个报文进行一次确认。

image-20210804160651311

其实,我自己都觉得这个图看起来很烦,咋一看,看不懂。我简单的总结一下。这个滑动窗口的机制就是为了并发的发送数据,提高传输效率的。所谓窗口就是指我们一次能并发发送的数据数据报的条数。在这个窗口大小内,我都是并发发送的,不需要等到接收方的ack后才发送。而只有当接收方返回给我一个ack,告诉我下一条发送的数据报序号,我就会根据这个序号滑动对应长度。但是返回的ack往往并不如意,可能在一串数据报中,丢失了一些数据包,接收方本着要得到完成数据包的想法,不管丢的是哪一段,他都会缺失的数据包序号返回给你,而你就能根据发送的序号知道是否数据有丢包,对于一种特殊情况,如果丢失的是中间段的包,接收方就会把后半段未丢失的包也丢失,这样,方便发送方按照自己的ack重传丢失段落后的所有包,不会有重复包。

?

延迟应答

接收端接收到数据后可以在避免网络用撒的前提下,延迟自己的应答时间,这样可以让服务端快速消费数据,之后空闲出来的缓冲区更大,返回给接收端的窗口大小就大,这样就能加快传输速率。

延迟的机制:可以每隔n个包就ack一次;也可以设置一个延迟应答时间,超过这个时间就ack一次。

捎带应答

在延时应答的基础上,我们发现,接受方和发送方都是“一发一收”,所以,我们在发送数据的时候,我们把ACK搭顺风车的方式发送给对方了。

粘包问题

tcp没有不像udp,没有报文长度的记录,只有一个序号,而且udp是一次发,一次读,而tcp是全部写入缓冲区再发;这样对于多段报文之间的开始和结束界限就不是那么明确,所以就需要我们在应用层约定好tcp的数据格式,双方按照既定的格式解析。

最后总结一下tcp和udp的区别
  • tcp安全性高,但是效率低;而udp是无连接的,不可靠,但是速度快。
  • tcp是面向字节流,可以多次收发;而udp是面向数据报,只能一次收发
  • tcp连接的双方都具有发送和接收缓冲池,而udp只有接收缓冲池,没有发送缓冲池。
  • tcp发送的数据大小不受限,udp发送数据大小首先,一次最多64k。

网络层

MTU协议

用于数据分片;RFC标准定义以太网的默认MTU值为1500。早期的以太网使用共享链路的工作方式,为了保证CSMA/CD(载波多路复用/冲突检测)机制,所以规定了以太帧长度最小为64字节,最大为1518字节。最小64字节是为了保证最极端的冲突能被检测到,64字节是能被检测到的最小值;最大不超过1518字节是为了防止过长的帧传输时间过长而占用共享链路太长时间导致其他业务阻塞。所以规定以太网帧大小为64~1518字节,虽然技术不断发展,但协议一直没有更改。

MTU对IP协议的影响: 由于链路层存在MTU的限制,导致网络层的报文如果超过1500字节,就必须要对齐进行分片发送。

将较大的IP包分成多个小包, 并给每个小包打上标签,每个小包IP协议头的 16位标识(id) 都是相同的,这样在重组的时候就知道这个小包来自于哪个报文。
每个小包的IP协议头的3位标志字段中, 第2位MF置为0, 表示允许分片, 第3位DF来表示结束标记(当前是否是后一个小包, 是的话置为1, 否则置为0)。
到达对端时再将这些小包按顺序重组, 拼装到一起返回给传输层。一旦这些小包中任意一个小包丢失,接收端的重组就会失败,但是IP层不会负责重新传输数据。
MTU对UDP协议的影响:

只要UDP报文中携带的数据超过过1472(1500 - 20(IP首部) - 8(UDP首部)),那么就会在网络层分成多个IP数据报。
这些IP数据报有任意一个丢失,都会引起接收端网络层重组失败。那么这就意味着,如果UDP数据报在网络层被分片,整个数据被丢失的概率就大大增加。
MTU对TCP协议的影响:

tcp可以多次重发,而且有超时重传等一系列的安全收发机制,如果分包有丢失的情况,可以进行重新发送;

ip协议格式

image-20210804182112920

IP地址

IP作用于OSI参考模型中的网络层,在终端通信中作为唯一标识,便于确定数据的传递目标。

IP地址分为:IPv4IPv6;大多数用户熟悉并且流行的IP地址是IPv4,其是用点分四组十进制的表示方法展示的,例如,192.168.23.4117.43.56.3等。而IPv6的位数就比较大了,是128位的,长度是IPv4的4倍,并且其表示方式是分块的八组四个十六进制数,例如:5f05:2000:80ad:5800:0058:0800:2023:1d71,每个块儿之间都是用 : 隔开的。如果把IPv6和端口号一起使用的话,可能会出现这样的情况:http://2001:0db8:85a3:08d3:1319:8a2e:0370:7344:443/

这样就没法区分端口号和地址了,所以就用这样的方式来表示一个地址和端口号:http://[2001:0db8:85a3:08d3:1319:8a2e:0370:7344]:443/

ip寻址

在长度为32位的IPv4地址中,有一段连续位称为网络号,还有一段连续位称为主机号

网络号就是用来表示主机所处的网络区域,而主机号是用来确认表示主机所处当前网络中的特定主机。这样在寻址的时候就可以识别一台主机所处网络以及在网络区域中的具体地址了!

ipv4分类

在IPV4中,网络地址可以分为5类:A类,B类,C类,D类,E类;

  • A类:网络号共8位,首位固定为 0,接下来连续的7位可以自由设定;主机号为24位;地址范围:0.0.0.0~127.255.255.255;因为B类最小值就是前两位为10,后面全为0的数值,也就是128.0.0.0;后面的地址范围依次类推;
  • B类:网络号共16位,前两位固定为 1 0,接下来连续的14位可以自由设定;主机号为16位;
  • C类:网络号共24位,前三位固定为 1 1 0,接下来连续的21位可以自由设定;主机号为8位;
  • D类:为组播地址,共32位,前四位固定为 1 1 1 0
  • E类: 为保留地址,共32位,前四位固定为 1 1 1 1;

A 、B 、C类地址大多都是单播地址,因此它们可用于接口分配。

就拿A类地址来说,因为A类地址网络号占8位,而首位固定是0,那么剩下的7位都是可以自由分配的,而主机号位数是24位,那么就有2^24个主机数,意思就是A类地址可以分配2 ^7个网络区域,每个网络区域可以有2 ^24台主机。

既然ip地址划分为5类,那么他们地址范围是什么呢?

image-20210802174226354

子网寻址

在一些特殊的场景下,如果一个区域的主机数不能跟实际需求想符合,比如如果我们在C类网络下需要他所能承受范围内的主机数;那么就会造成ip不足;另一方面,如果我们在A类网络区域下,但是主机却只有几台,那么就会造成浪费,这实在是暴殄天物啊!于是我们就采用了子网寻址的方法解决这个问题。

所谓子网寻址就是将一个类别的子网继续划分成多个子网区域,每个区域各自有对应的子网号和主机号;例如,B类网络网络号有16位,主机号有16位,我们可以将16位主机号分为8位子网号和8位主机号,这样将B类网络划分为了很多个子网,更加适用于我们实际的生产环境。

image-20210802204536052

子网掩码

确定一个ip地址的网络/子网部分的结束和主机部分的开始;他的长度和ip地址长度相等(IPV4是32位,ipv6是128位),对于IPv4来说,子网掩码也是用点分四组十进制来表示的。当子网掩码用二进制表示时,结构非常简单且容易记忆,从左边开始由一段连续的1组成,紧接着又一段连续的0组成直到最后。其中连续的1的长度称为前缀长度,用 /长度 来表示

十进制表示前缀长度二进制表示
128.0.0.0/110000000 00000000 00000000 00000000
255.0.0.0/811111111 00000000 00000000 00000000
255.192.0.0/1011111111 11000000 00000000 00000000
255.255.0.0/1611111111 11111111 00000000 00000000
255.255.254.0/2311111111 11111111 11111110 00000000
255.255.255.224/2711111111 11111111 11111111 11100000
255.255.255.255/3211111111 11111111 11111111 11111111

? 子网掩码二进制位1对应ip地址的网络/子网部分;0对应主机号部分,以子网寻址的例子为例,将B类网络的主机位划分为8位子网号和8位主机位号,那么就会提前设置好一个长度为16+8=24的子网掩码,即255.255.255.0,表示前24位是网络/子网部分,那么路由器在处理ip地址的时候会手先查看子网掩码,将ip地址与子网掩码进行与运算就可以得出该IP地址所属的子网区域。例如,校验128.32.1.14,这个ip就是8位子网号8位主机号,那么与子网掩码255.255.255.0进行与运算就得到128.32.1.0,可以发现该结果和128.32.1.14属于同一网段,也就是处于相同子网。

在实际使用中子网掩码的长度是可变的,我们可以根据实际所需支持的主机数来设置子网掩码的长度。

image-20210802213653725

广播地址

广播地址是专门用于同时向网络中所有工作站进行发送的一个地址。在使用[TCP/IP 协议](https://baike.baidu.com/item/TCP%2FIP 协议/2116790)的网络中,主机标识段host ID 为全1 的IP 地址为广播地址,广播的分组传送给host ID段所涉及的所有计算机。简单的说该子网段中数值最大的那个数就是广播地址。那么如何取得这个地址呢,就是将子网掩码的所有位取反,然后与子网内的ip进行或运算得到的结果就是广播地址。

image-20210802213442233

数据链路层

mac地址:

总得来说MAC地址是用来表示网卡硬件的物理地址;区别标识网络设备的逻辑ip地址。

详细的讲表示互联网每一个站点的标识符,采用十六进制数表示,共六个字节,其中,前三个字节是由IEEE的注册管理机构RA负责给不同厂家分配的代码,也称为“编制上唯一的标识符” , 一个地址可以生成2^24个不同的地址,MAC地址实际就事是适配器地址或适配器标志符EUI-48.(Organzationally Unique Identifier),后三个字节有各厂家自行指派给生产的适配层接口,称为扩展标识符。

链路层的功能

在物理层的基础上向网络层提供服务,将不可靠的物理连接改造为逻辑上无差错的数据链路连接,使之对网络层表现为一条无差错的链路

  1. 为网络层提供服务(无确认连接、有确认无连接、有确认面向连接服务)
  2. 链路管理
  3. 组帧
  4. 流量控制
  5. 差错控制(帧错/位错)
组帧

封装成帧即在数字包前后分别加上帧头和帧尾
帧头和帧尾包含许多控制信息,他们的一个重要作用:帧定界(确定帧的界限)

帧同步:接收方应当能从接收的二进制比特流中区分出帧的起始和结束

image-20210804183958485

ARP协议

数据在传输的时候除了要知道源ip和目的ip之外,还需要知道源mac地址和目的mac地址。但是目的mac地址是未知的,就需要用到ARP协议。

ARP是介于链路层到网络层之间的协议,它的作用是为了解析IP地址到MAC地址的映射,在网络层一个数据报拿到了下一条的IP地址,但是数据报是要经过底层的链路层传输的,所以要通过ARP协议得到下一条的MAC地址才能传输数据报。数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃。

ARP协议工作原理:

  • 源主机发出ARP请求,询问“IP地址是192.168.0.1的主机的硬件地址是多少”,并将这个请求广播到本地网段(以太网帧首部的硬件地址填FF:FF:FF:FF:FF:FF表示广播)
  • 目的主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的硬件地址填写在应答包中。
    每台主机都维护一个ARP缓存表可以用arp -a命令查看。缓存表中的表项有过期时间(一般为20分钟)如果20分钟内没有再次使用某个表项则该表项失效,下次还要发ARP请求来获得目的主机的硬件地址。

为什么要存在缓存表?

缓存表其实是为了提高效率的,要不然每次发送数据都要先去广播的到对端的MAC地址。

缓存表中的数据为什么要设置有效时间?

假设在缓存表中的数据一直不变,而一台主机的网卡坏掉了,这时该主机的MAC地址已经改变,如果依然按照缓存表中的映射去发送,那么就会产生一些没用的网络数据。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-08-06 10:11:58  更:2021-08-06 10:12:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/4 20:28:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码