计网

发布于 2024-06-02  433 次阅读


应用层

专注于为用户提供应用功能,比如 HTTP、FTP、Telnet、DNS、SMTP等。

HTTP

HTTP 是超文本传输协议,常见状态码:

状态码

字段

HOST字段:客户端发送请求时,用来指定服务器的域名。

Content-Length 字段:表明本次回应的数据长度(通过设置回车符、换行符作为 HTTP header 的边界,通过 Content-Length 字段作为 HTTP body 的边界,用于解决粘包问题)

Connection 字段:常用于客户端要求服务器使用「HTTP 长连接」机制,以便其他请求复用,只要任意一端没有明确提出断开连接,则保持 TCP 连接状态。(HTTP/1.1 版本的默认连接都是长连接,但为了兼容老版本的 HTTP,需要指定 Connection 首部字段的值为 Keep-Alive)

Content-Type 字段:用于服务器回应时,告诉客户端,本次数据是什么格式(客户端请求的时候,可以使用 Accept 字段声明自己可以接受哪些数据格式)

Content-Encoding 字段:说明数据的压缩方法。表示服务器返回的数据使用了什么压缩格式

get和post

GET 的语义是请求获取指定的资源。GET 方法是安全、幂等、可被缓存的。(一般写在url里)

POST 的语义是根据请求负荷(报文主体)对指定的资源做出处理,具体的处理方式视资源类型而不同。POST 不安全,不幂等,(大部分实现)不可缓存。

但是实际过程中,开发者不一定会按照 RFC 规范定义的语义来实现 GET 和 POST 方法

HTTP缓存

HTTP 缓存有两种实现方式,分别是强制缓存和协商缓存

强缓存指的是只要浏览器判断缓存没有过期,则直接使用浏览器的本地缓存,决定是否使用缓存的主动性在于浏览器这边。

  • Cache-Control, 是一个相对时间;
  • Expires,是一个绝对时间;

如果 HTTP 响应头部同时有 Cache-Control 和 Expires 字段的话,Cache-Control 的优先级高于 Expires 

协商缓存

第一种:请求头部中的 If-Modified-Since 字段与响应头部中的 Last-Modified 字段实现,这两个字段的意思是:

  • 响应头部中的 Last-Modified:标示这个响应资源的最后修改时间;
  • 请求头部中的 If-Modified-Since:当资源过期了,发现响应头中具有 Last-Modified 声明,则再次发起请求的时候带上 Last-Modified 的时间,服务器收到请求后发现有 If-Modified-Since 则与被请求资源的最后修改时间进行对比(Last-Modified),如果最后修改时间较新(大),说明资源又被改过,则返回最新资源,HTTP 200 OK;如果最后修改时间较旧(小),说明资源无新修改,响应 HTTP 304 走缓存。

第二种:请求头部中的 If-None-Match 字段与响应头部中的 ETag 字段,这两个字段的意思是:

  • 响应头部中 Etag:唯一标识响应资源;
  • 请求头部中的 If-None-Match:当资源过期时,浏览器发现响应头里有 Etag,则再次向服务器发起请求时,会将请求头 If-None-Match 值设置为 Etag 的值。服务器收到请求后进行比对,如果资源没有变化返回 304,如果资源变化了返回 200。

ETag 字段的方式优先级更高

协商缓存这两个字段都需要配合强制缓存中 Cache-Control 字段来使用,只有在未能命中强制缓存的时候,才能发起带有协商缓存字段的请求

HTTP版本

HTTP/1.1 优点是简单灵活易于扩展应用广泛和跨平台,缺点是无状态明文传输不安全。性能上有长连接管道运输的特点

HTTP/2 协议是基于 HTTPS 的,所以 HTTP/2 的安全性也是有保障的。

那 HTTP/2 相比 HTTP/1.1 性能上的改进:

  • 头部压缩
  • 二进制格式
  • 并发传输
  • 服务器主动推送资源

TCP丢包会触发“队头阻塞”

HTTP/3 把 HTTP 下层的 TCP 协议改成了 UDP

基于 UDP 的 QUIC 协议 可以实现类似 TCP 的可靠性传输

QUIC 有以下 3 个特点。

  • 无队头阻塞
  • 更快的连接建立
  • 连接迁移

HTTP和HTTPS

HTTP 是超文本传输协议,信息是明文传输,存在安全风险的问题。默认端口号是 80。

HTTPS 则解决 HTTP 不安全的缺陷,在 TCP 和 HTTP 网络层之间加入了 SSL/TLS 安全协议,使得报文能够加密传输。在HTTP基础上还需进行 SSL/TLS 的握手过程,才可进入加密报文传输。默认端口号是 443。需要向 CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的。

HTTPS多了信息加密校验机制身份证书解决窃取篡改伪装等问题。(混合加密(非对称加密+对称加密)、摘要算法、数字证书)

SSL/TLS 协议基本流程:

  • 客户端向服务器索要并验证服务器的公钥。
  • 双方协商生产「会话秘钥」。
  • 双方采用「会话秘钥」进行加密通信。

密钥交换算法有RSA 算法和 ECDHE 算法

RSA算法:

记录协议

传输层

TCP协议:有流量控制、超时重传、拥塞控制等功能,为了保证数据包能可靠地传输给对方

传输层的数据包大小超过 MSS(TCP 最大报文段长度) ,就要将数据包分块,这样即使中途有一个分块丢失或损坏了,只需要重新发送这一个分块,而不用重新发送整个数据包

UDP协议 :只负责发送数据包,不保证数据包是否能抵达对方,但它实时性相对更好,传输效率也高。当然,UDP 也可以实现可靠传输,把 TCP 的特性在应用层上实现就可以

传输层的报文中会携带端口号,因此接收方可以识别出该报文是发送给哪个应用

TCP三次握手

为什么是三次握手?不是两次、四次

原因一:避免历史连接(主要原因)

三次握手的首要原因是为了防止旧的重复连接初始化造成混乱

此外为了同步序列号(四次握手合并三次)、避免建立多个冗余连接

为什么每次建立 TCP 连接时,初始化的序列号都要求不一样呢?

主要原因有两个方面:

  • 为了防止历史报文被下一个相同四元组的连接接收(主要方面);
  • 为了安全性,防止黑客伪造的相同序列号的 TCP 报文被对方接收;

初始序列号 ISN 是如何随机产生的?

计时器+Hash算法

既然 IP 层会分片,为什么 TCP 层还需要 MSS 呢

经过 TCP 层分片后,如果一个 TCP 分片丢失后,进行重发时也是以 MSS 为单位,而不用重传所有的分片,大大增加了重传的效率

什么是 SYN 攻击?如何避免 SYN 攻击

我们都知道 TCP 连接建立是需要三次握手,假设攻击者短时间伪造不同 IP 地址的 SYN 报文,服务端每接收到一个 SYN 报文,就进入SYN_RCVD 状态,但服务端发送出去的 ACK + SYN 报文,无法得到未知 IP 主机的 ACK 应答,久而久之就会占满服务端的半连接队列,使得服务端不能为正常用户服务。

  • 调大 netdev_max_backlog;
  • 增大 TCP 半连接队列;
  • 开启 tcp_syncookies;
  • 减少 SYN+ACK 重传次数

TCP四次挥手

主动关闭连接的,才有 TIME_WAIT 状态

重传机制

超时重传:超时重传时间 RTO 的值应该略大于报文往返 RTT 的值

快速重传:收到三个相同的ACK

SACK 方法:在 TCP 头部「选项」字段里加一个 SACK 的东西,它可以将已收到的数据的信息发送给「发送方」

滑动窗口

窗口大小就是指无需等待确认应答,而可以继续发送数据的最大值

窗口的大小是由接收方的窗口大小来决定的。

发送方窗口约等于接收方窗口

流量控制

窗口关闭(探测)

拥塞控制

拥塞窗口 cwnd是发送方维护的一个的状态变量,它会根据网络的拥塞程度动态变化的

慢启动:

  • 当 cwnd < ssthresh 时,使用慢启动算法。
  • 当 cwnd >= ssthresh 时,就会使用「拥塞避免算法」。

指数增长

拥塞避免算法:变成线性增长

拥塞发生

  • ssthresh 设为 cwnd/2
  • cwnd 重置为 1 (是恢复为 cwnd 初始化值,我这里假定 cwnd 初始化值 1)

或者:

  • cwnd = cwnd/2 ,也就是设置为原来的一半;
  • ssthresh = cwnd;
  • 进入快速恢复算法

快速恢复算法:

  • 拥塞窗口 cwnd = ssthresh + 3 ( 3 的意思是确认有 3 个数据包被收到了);
  • 重传丢失的数据包;
  • 如果再收到重复的 ACK,那么 cwnd 增加 1;
  • 如果收到新数据的 ACK 后,把 cwnd 设置为第一步中的 ssthresh 的值,原因是该 ACK 确认了新的数据,说明从 duplicated ACK 时的数据都已收到,该恢复过程已经结束,可以回到恢复之前的状态了,也即再次进入拥塞避免状态;

网络层

IP 协议Internet Protocol):IP 协议会将传输层的报文作为数据部分,再加上 IP 包头组装成 IP 报文,如果 IP 报文大小超过 MTU(以太网中一般为 1500 字节)就会再次进行分片

IPV4:网络号、主机号、子网掩码

寻址:先匹配到相同的网络号(表示要找到同一个子网),才会去找对应的主机(去哪)

路由:当数据包到达一个网络节点,通过路由算法决定下一步走哪条路径(怎么走)

IP 地址(IPv4 地址)由 32 位正整数来表示,IP 地址在计算机是以二进制的方式处理的

广播地址用于在同一个链路中相互连接的主机之间发送数据包

IP 地址与路由控制

确定 IP 包首部中的目标地址,再从路由控制表中找到与该地址具有相同网络地址的记录,根据该记录将 IP 包转发给相应的下一个路由器。如果路由控制表中存在多条相同网络地址的记录,就选择相同位数最多的网络地址,也就是最长匹配。

环回地址是在同一台计算机上的程序之间进行网络通信时所使用的一个默认地址。

计算机使用一个特殊的 IP 地址 127.0.0.1 作为环回地址。与该地址具有相同意义的是一个叫做 localhost 的主机名。使用这个 IP 或主机名时,数据包不会流向网络。

DNS

ARP

NAT

网络接口层

以太网:一种在「局域网」内,把附近的设备连接起来,使它们之间可以进行通讯的技术。包括:以太网接口,Wi-Fi接口,以太网交换机、路由器上的千兆,万兆以太网口,网线等

MAC 头部是以太网使用的头部,它包含了接收方和发送方的 MAC 地址等信息,我们可以通过 ARP 协议获取对方的 MAC 地址

网络接口层主要为网络层提供「链路级别」传输的服务,负责在以太网、WiFi 这样的底层网络上发送原始数据包,工作在网卡这个层次,使用 MAC 地址来标识网络上的设备

江东日暮云
最后更新于 2024-06-04