计算机网络协议

135 阅读16分钟

参考:计算机网络六十二问 mp.weixin.qq.com/s/KElyt2dBu…

1、TCP/IP四层模型

应用层、传输层、网络层、数据链路层

image.png

协议协议作用
应用层HTTP应用之间的通信
传输层TCP实现进程间的通信,TCP头部包含端口号
网络层IP实现主机间的通信,IP头部包含源和目的IP
数据链路层实现设备间的通信,头部包含源和目的MAC地址

2、从浏览器地址栏输入URL到显示主页的过程

  1. DNS 解析:将域名解析成对应的 IP 地址。
  2. TCP连接:与服务器通过三次握手,建立 TCP 连接
  3. 向服务器发送 HTTP 请求
  4. 服务器处理请求,返回HTTp响应
  5. 浏览器解析并渲染页面
  6. 断开连接:TCP 四次挥手,连接结束

应用层协议

HTTP协议

HTTP/1.0,1.1,2.0,3.0的区别

关键需要记住 HTTP/1.0 默认是短连接,可以强制开启,HTTP/1.1 默认长连接,HTTP/2.0 采用多路复用

HTTP/1.0

  • 默认使用短连接,每次请求都需要建立一个 TCP 连接。它可以设置Connection: keep-alive 这个字段,强制开启长连接。

HTTP/1.1

  • 引入了持久连接,即 TCP 连接默认不关闭,可以被多个请求复用。
  • 分块传输编码,即服务端每产生一块数据,就发送一块,用” 流模式” 取代” 缓存模式”。
  • 管道机制,即在同一个 TCP 连接里面,客户端可以同时发送多个请求。

HTTP/2.0

  • 二进制协议,1.1 版本的头信息是文本(ASCII 编码),数据体可以是文本或者二进制;2.0 中,头信息和数据体都是二进制。
  • 完全多路复用,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,而且不用按照顺序一一对应。
  • 报头压缩,HTTP 协议不带有状态,每次请求都必须附上所有信息。Http/2.0 引入了头信息压缩机制,使用 gzip 或 compress 压缩后再发送。
  • 服务端推送,允许服务器未经请求,主动向客户端发送资源。

HTTP/3主要有两大变化,传输层基于UDP、使用QUIC保证UDP可靠性

HTTP/2存在的一些问题,比如重传等等,都是由于TCP本身的特性导致的,所以HTTP/3在QUIC的基础上进行发展而来,QUIC(Quick UDP Connections)直译为快速UDP网络连接,底层使用UDP进行数据传输。

HTTP/3主要有这些特点:

  • 使用UDP作为传输层进行通信
  • 在UDP的基础上QUIC协议保证了HTTP/3的安全性,在传输的过程中就完成了TLS加密握手
  • HTTPS 要建⽴⼀个连接,要花费 6 次交互,先是建⽴三次握⼿,然后是 TLS/1.3 的三次握⼿。QUIC 直接把以往的 TCP 和 TLS/1.3 的 6 次交互合并成了 3 次,减少了交互次数。
  • QUIC 有⾃⼰的⼀套机制可以保证传输的可靠性的。当某个流发⽣丢包时,只会阻塞这个流,其他流不会受到影响。

HTTPS建立连接的过程

HTTP是明文传输,有窃听、篡改、仿冒的风险。HTTPS是在HTTP和TCP层之间加了SSL/TLS协议,保证传输通道的安全。

  1. 客户端发起 HTTPS 请求,连接到服务端的 443 端口。
  2. 服务端有一套数字证书(证书内容有公钥、证书颁发机构、失效日期等)。
  3. 服务端将自己的数字证书发送给客户端(公钥在证书里面,私钥由服务器持有)。
  4. 客户端收到数字证书之后,会验证证书的合法性。如果证书验证通过,就会生成一个随机的对称密钥,用证书的公钥加密。
  5. 客户端将公钥加密后的密钥发送到服务器。
  6. 服务器接收到客户端发来的密文密钥之后,用自己之前保留的私钥对其进行非对称解密,解密之后就得到客户端的密钥,然后用客户端密钥对返回数据进行对称加密,酱紫传输的数据都是密文啦。
  7. 服务器将加密后的密文返回到客户端。
  8. 客户端收到后,用自己的密钥对其进行对称解密,得到服务器返回的数据。

image.png

客户端验证证书的过程:

服务端找CA申请证书,CA会生成一个证书,并用自己的私钥对证书进行签名。证书中包含的核心内容是颁发者、有效期、用途、持有者的公钥。

客户端校验证书时,使用CA的公钥验签,就能确保证书没有被篡改。

image.png

DNS

DNS解析的过程

域名解析过程

域名解析系统,把域名解析成IP。先根据域名查询本地Hosts文件中是否有配置,如果没有,调用DNS服务器获取IP。

DNS解析服务器是分级的,先请求根服务器获取顶级域名服务器,再请求顶级域名服务器获取权威域名服务器,再获取权限域名服务器。

DNS用的什么协议

DNS解析用的是UDP协议,因为UDP协议性能高,且返回报文小,不会超过UDP报文大小限制(512B)。不过当报文大小超过时,客户端发现UDP返回报文做了截断后,会升级成TCP协议。

DNS服务器的区域传输(主从同步)用的是TCP报文,因为报文比较大。

详细:为什么 DNS 协议使用 UDP?只使用了 UDP 吗?cloud.tencent.com/developer/a…

DNS劫持

DNS劫持又称域名劫持,是指在劫持的网络范围内拦截域名解析的请求,返回假的IP地址或者什么都不做使请求失去响应。

应对方法是使用自己的解析服务器或者是提前在自己的App中将解析好的域名以IP的形式,DNKeeper就是用自己的解析服务器。

WebSocket

HTTP是请求响应式,WebSocket是全双工,允许服务端主动向客户端发送消息,是基于TCP协议。

WebSocket复用了HTTP的握手通道。具体指的是,客户端通过HTTP请求与WebSocket服务端协商升级协议。协议升级完成后,后续的数据交换则遵照WebSocket的协议。

HTTP协议升级到WebSocket的过程

首先,客户端发起协议升级请求。可以看到,采用的是标准的HTTP报文格式,且只支持GET方法。Header中,Connection: Upgrade,表示要升级协议。

服务端响应协议升级,服务端返回内容如下,状态代码101表示协议切换。到此完成协议升级,后续的数据交互都按照新的协议来。

优点:支持双向通信,更灵活,更高效,可扩展性更好。

  1. 支持双向通信,实时性更强。
  2. 更好的二进制支持。
  3. 较少的控制开销。连接创建后,ws客户端、服务端进行数据交换时,协议控制的数据包头部较小。在不包含头部的情况下,服务端到客户端的包头只有2~10字节(取决于数据包长度),客户端到服务端的的话,需要加上额外的4字节的掩码。而HTTP协议每次通信都需要携带完整的头部。
  4. 支持扩展。ws协议定义了扩展,用户可以扩展协议,或者实现自定义的子协议。(比如支持自定义压缩算法等) image.png

协议升级时,客户端请求头中会传递Sec-WebSocket-Key,服务端响应头中响应Sec-WebSocket-Accept。 主要作用在于提供基础的防护,减少恶意连接、意外连接,比如防止客户端误申请协议升级、服务端不理解ws协议、反向代理等等。不能保证数据安全,如果想保证数据安全,需要使用wss(结合TLS协议)

参考:WebSocket协议:5分钟从入门到精通 www.cnblogs.com/chyingp/p/w…

PING

ping,Packet Internet Groper,是一种因特网包探索器,用于测试网络连接量的程序。Ping 是应用层的一个服务命令, 主要是向特定的目的主机发送 ICMP请求报文,测试目的站是否可达及了解其有关状态。PING的原理就是发送ICMP报文,根据报文响应中的时间戳可计算往返时间。

Cookie和Session

传输层协议

TCP

TCP三次握手和四次挥手

TCP是面向连接的可靠传输,在建立连接时需要进行三次握手,连接断开时需要进行四次挥手。

三次握手

一开始,客户端在CLOSE状态,服务端在LISTEN状态(accept阻塞)。客户端发送SYN请求,携带序列号seq=x,然后进入SYS_SENT状态;服务端收到后,发送SYN ACK,ack=x+1,并传递seq=y,然后进入SYN_RCVD状态;客户端收到后,发送应答ACK,ack=y+1,然后客户端和服务端都进入ESTABLISHED状态。

image.png

四次挥手

一开始,客户端和服务端都在ESTABLISHED状态,客户端发送FIN请求,携带序列号seq=u,然后进入FIN_WAIT_1;服务端收到后,发送应答ACK,ack=u+1,传递seq=v,然后进入CLOSE_WAIT状态;客户端收到后,状态改为FIN_WAIT_2;等服务端数据发送完成后,服务端发送FIN ACK请求,ack=u+1,seq=w,进入LAST_ACK状态;客户端收到后,发送ACK,ack=w+1,seq=u+1,状态进入TIME_WAIT;服务端收到后,进入CLOSE状态;客户端等2MSL之后,进入CLOSE状态。

image.png

半连接队列、SYN Flood

TCP 进入三次握手前,服务端会从 CLOSED 状态变为 LISTEN 状态, 同时在内部创建了两个队列:半连接队列(SYN 队列)和全连接队列(ACCEPT 队列)。半连接队列存放的是三次握手未完成的连接,全连接队列存放的是完成三次握手的连接。服务端发送SYN ACK后,这个连接就放入半连接队列中,当三次握手完成后,会加入全连接队列。

为什么需要半连接队列?

SYN Flood是一种典型的DDos攻击,它在短时间内伪造不存在的IP地址,向服务端发送大量SYN报文,当服务端发送SYN ACK后,它不发送ACK报文,导致服务端的半连接队列爆满,使得正常的连接无法建立。

应对措施:

  • syn cookie:服务器收到SYN后,按照一定的方法计算出一个cookie值作为自己的SYN ACK的序列号,不把连接放到半连接队列中。当收到ACK后,再确认序列号是否正确,正确则建立连接,否则丢弃。
  • SYN Proxy防火墙:防火墙对收到的每一个SYN进行代理和回应,并保持半连接;等发送方将ACK包返回后,再重新构造SYN发送给服务器,建立真正的TCP连接。
为什么客户端要等待2MSL

MSL 是 Maximum Segment Lifetime,报⽂最⼤⽣存时间,它是任何报⽂在⽹络上存在的最⻓时间,超过这个时间报⽂将被丢弃。TIME_WAIT 等待 2 倍的 MSL,⽐较合理的解释是:⽹络中可能存在来⾃发送⽅的数据包,当这些发送⽅的数据包被接收⽅处理后⼜会向对⽅发送响应,所以⼀来⼀回需要等待 2 倍的时间。

  1. 为了保证客户端发送的最后一个 ACK 报文段能够到达服务端。 这个 ACK 报文段有可能丢失,因而使处在 LAST-ACK 状态的服务端就收不到对已发送的 FIN + ACK 报文段的确认。服务端会超时重传这个 FIN+ACK 报文段,而客户端就能在 2MSL 时间内(超时 + 1MSL 传输)收到这个重传的 FIN+ACK 报文段。接着客户端重传一次确认,重新启动 2MSL 计时器。最后,客户端和服务器都正常进入到 CLOSED 状态。

  2. 防止已失效的连接请求报文段出现在本连接中。客户端在发送完最后一个 ACK 报文段后,再经过时间 2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样就可以使下一个连接中不会出现这种旧的连接请求报文段。

为什么必须三次握手、四次挥手
TIME_WAIT状态过多会导致什么问题

如果服务器有处于TIME_WAIT状态的TCP,说明时服务端主动发起的断开请求。危害是内存资源占用和端口资源占用。

解决方法是服务器可以设置SO_REUSEADDR,表示可以重用TIME_WAIT状态的端口。或者考虑TCP长连接。

TCP是如何保证可靠性的

校验和、连接管理、确认应答机制、流量控制、拥塞控制、超时重传。

流量控制

流量控制是避免发送方的数据填满接收方的缓存。

让发送端根据接收端的实际接受能力控制发送的数据量。TCP通过滑动窗口来控制流量。

首先双方三次握手,初始化各自的窗口大小,窗口大小在TCP头部。发送方和接收方各自有一个缓存队列窗口。接收方接收数据后,缩小滑动窗口大小,并将可用的窗口大小反馈给发送方。发送方会根据接收方的窗口大小控制发送数据的大小。

拥塞控制:

拥塞控制是为了保证在网络情况不好时,自动降低发送速率,避免加重网络阻塞,在网络恢复时,再提高发送速率。TCP头中有拥塞窗口大小。

TCP拥塞控制阶段:慢启动、拥塞避免、拥塞发生、拥塞恢复。

慢启动:一开始窗口大小为1,试探网络情况,网络情况好时(未发生丢包)指数增长窗口。

拥塞避免:窗口不能无限增长,设置阈值,达到阈值之后,线性增长。

拥塞发生:当出现丢包时,认为拥塞发生,此时有两种方法,一种是RTO超时重传,一种是快速恢复,这两种都是调整窗口大小。第一种是直接从慢启动开始从头调整窗口;第二种是将窗口降到阈值+3。

快速恢复

image.png

粘包和拆包

TCP 是面向流,它会根据 TCP 缓冲区的实际情况进行包的划分,一个完整的包可能会被 TCP 拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的 TCP 粘包和拆包问题。

解决方法:

  • 发送端将每个数据包封装为固定长度
  • 在数据尾部增加特殊字符进行分割
  • 将数据分为两部分,一部分是头部,一部分是内容体;其中头部结构大小固定,且有一个字段声明内容体的大小。

UDP

TCP和UDP的区别

1)TCP 需要三次握手建立连接,四次挥手释放连接;UDP 不需要,面向无连接

2)TCP 首部需要 20 个字节;而 UDP 首部只有 8 个字节

3)TCP 具有一系列保证可靠传输的机制;而 UDP 尽最大努力交付,不提供可靠传输的机制,如果在数据传输的过程中出现部分数据的丢失,UDP 协议本身并不能做出任何检测或补救措施

4)TCP 是面向字节流的,而 UDP 是面向报文的

TCP 具有序列号机制,发送方会把一个大的 HTTP 报文按序号分割成若干报文段并加上 TCP 首部,也就是封装成 TCP 报文段。那么接收方在收到这些 TCP 报文段后,就会按照序号以原来的顺序重组 HTTP 报文;UDP 没有像 TCP 一样的序列号机制来标识报文,不做任何的拆分与合并

5)正是由于 UDP 没有了可靠传输机制,所以速度远远快于 TCP,在某些情况下 UDP 是一种最有效的工作方式,一般用于即时通信,比如:语音电话、 直播等等;而 TCP 一般用于文件传输、发送和接收邮件、远程登录等准确性要求比较高的场景

网络层协议

IP

IP地址不够的解决方法:DHCP动态主机配置协议、NAT网络地址转换协议、IPv6

ARP

地址解析协议,实现IP地址到MAC地址的映射。过程是:每台主机上有一个IP和MAC的映射表,先从本机上查找,如果没有找到,则在本网段内发送广播,其他主机收到包之后,看看IP是不是自己的,如果是,则进行响应并返回MAC地址,并更新自己的映射表。发送的主机收到响应之后,也更新自己的映射表。

ICMP

网际控制报文协议,是一种面向无连接的协议,主要用于在主机与路由器之间传递控制信息,包括报告错误、交换受限控制和状态信息等。

网络安全

DDos攻击

CSRF跨站请求伪造

用户登录网站A后,浏览器上操作恶意网站B,B拿到A的cookie后做一些操作

应对措施:可以使用随机生成的token做校验,如果没携带token则拦截请求

XSS跨站脚本攻击

  1. 攻击者发现存在漏洞的网站,然后利用漏洞在网页中注入恶意脚本。
  2. 当用户访问网站时,恶意脚本被加载到浏览器中并触发执行。
  3. 恶意脚本访问浏览器留存的Cookie、会话令牌以及其他敏感信息,甚至可以改写页面内容,从而达成攻击目的。

包含反射型、存储型、DOM反射型,存储型危害比较大,用户输入中包含一些恶意脚本,存储到后台,前台页面解析时自动执行恶意代码。

应对措施:遵循安全编码规范,对用户输入做校验、转义等,禁止script脚本执行等