1.DNS解析:域名-> IP 地址

域名相比于 IP 地址,更容易被用户记忆和使用,其次其还具有商业标识价值和网络导航及搜索引擎优化的作用。

 DNS(Domain Name System):一个专门保存域名和IP地址映射关系的服务器,它是分布式的。

DNS 的解析流程

DNS 中的域名是通过 . 来分割的,两个句号之间的部分代表一个域(zone),除去上面的部分还有一个根域,下一层 .com 代表顶级域,再往下是 baidu.com。每一个域都有根服务器的地址,因此当查询的时候只要找到任何一台 DNS 服务器就可以直接导航到根域服务器了。

浏览器查询www.abc.com 的服务器的 IP 地址流程:

1.客户端先去发送一个 DNS 请求向 本地DNS服务器 来请求解析这个域名,比如在家庭网络中,路由器就可以提供本地 DNS 的服务。
2.本地 DNS 服务器查找自己的缓存发现没有找到这个地址对应的 IP 地址,于是它向根域名服务器发送请求,根域名服务器不直接提供域名解析的服务,而是起到一个导航的作用,将 .com 的顶级域名服务器的地址返回给请求方。
3.请求方拿到这个 IP 地址后再去向顶级域名服务器请求解析,顶级域名服务器同样不直接提供域名解析的服务,它将abc.com权威DNS服务器的地址交给了请求方。
4.这时候请求方再去请求 abc.com,权威域名服务器根据自己存储的权威数据将 IP 查询的结果返回给客户端。

2.网络层——HTTP协议:规范请求格式

HTTP(Hypertext Transfer Protocol)是应用层协议,用于客户端(如浏览器)与服务器之间的超文本(HTML、图片、视频等)传输,基于请求-响应模型工作。

1 HTTP请求报文:

·方法: 请求的方法,常见的方法有 GET、POST、PUT、DELETE 等。
·请求URI: 请求的统一资源标识符,指定了请求的资源。
·协议版本: HTTP 协议的版本号,例如 HTTP/1.1。
·请求头部字段: 请求头部字段和对应的值,用来传递请求的元数据信息,如 Host、User-Agent、Content-Type 等。
·空行: 请求头部和请求体之间的空行。
·请求正文: 请求的数据内容,仅在某些请求方法(如 POST)中存在。

2 HTTP响应报文:

·协议版本: HTTP 协议的版本号,例如 HTTP/1.1。
·状态码: 响应的状态码,表示请求处理的结果,常见的状态码有 200(成功)、404(未找到)、500(服务器内部错误)等。
·状态码描述: 状态码对应的描述信息。
·响应头部字段: 响应头部字段和对应的值,用来传递响应的元数据信息,如 Content-Type、·Content-Length、Cache-Control 等。
·空行: 响应头部和响应体之间的空行。
·响应正文: 响应的数据内容,通常包含请求的资源或者错误信息等。

3.传输层协议——TCP

TCP(传输控制协议)是传输层协议,核心目标是提供可靠、有序、面向连接的数据传输服务。

1.建立 TCP 连接,三次握手

客户端                  服务器
  |                      |
  |  SYN(seq=x)          |
  |---------------------->|  (SYN_RCVD状态)
  |                      |
  |  ACK(ack=x+1)        |
  |  SYN(seq=y)          |
  |<----------------------|
  | (ESTABLISHED状态)    |
  |                      |
  |  ACK(ack=y+1)        |
  |---------------------->|  (ESTABLISHED状态)
  |                      |
  • 第一次握手:客户端发送SYN=1,初始序列号seq=x(随机生成,如1000),可选参数MSS(最大段大小,通常1460字节)。
  • 第二次握手:服务器回复SYN=1, ACK=1,服务器序列号seq=y,确认号ack=x+1(确认客户端SYN),协商窗口大小。
  • 第三次握手:客户端发送ACK=1,确认号ack=y+1(确认服务器SYN),此时双方进入ESTABLISHED状态。

 为什么需要三次握手?

  • 防止半连接:两次握手可能导致服务器为延迟的SYN报文建立无效连接(如客户端崩溃未收到服务器SYN+ACK,服务器仍维持连接)。
  • 双向确认:确保双方均具备"发送→接收"能力(客户端确认服务器能收,服务器确认客户端能收且能发)。
  • 同步客户端和服务端的初始序列号,保障后续数据按序、去重、可靠传输;

如果只用两次握手:

  1. 网络中延迟滞留的旧连接报文到达服务端时,服务端会直接建立无效连接,浪费端口和内核资源;
  2. 只能验证客户端发、服务端收正常,无法验证服务端发送能力客户端能否收到,不满足 TCP 全双工可靠通信要求。

2.发送完了服务器四次挥手关闭 TCP 连接

主动关闭方            被动关闭方
  |                      |
  |  FIN(seq=u)          |
  |---------------------->|  (CLOSE_WAIT状态)
  | (FIN_WAIT_1状态)     |
  |                      |
  |  ACK(ack=u+1)        |
  |<----------------------|
  | (FIN_WAIT_2状态)     |
  |                      |
  |  FIN(seq=v)          |
  |  ACK(ack=u+1)        |
  |<----------------------|  (LAST_ACK状态)
  |                      |
  |  ACK(ack=v+1)        |
  |---------------------->|  (CLOSED状态)
  | (TIME_WAIT状态)      |
  | (2MSL后CLOSED)       |
  • 第一次挥手:主动关闭方发送FIN=1,序列号seq=u(当前数据发送位置),进入FIN_WAIT_1
  • 第二次挥手:被动关闭方回复ACK=1,确认号ack=u+1,进入CLOSE_WAIT(处理剩余数据),主动方进入FIN_WAIT_2
  • 第三次挥手:被动关闭方发送FIN=1, ACK=1,序列号seq=v,确认号ack=u+1,进入LAST_ACK
  • 第四次挥手:主动关闭方发送ACK=1,确认号ack=v+1,进入TIME_WAIT(持续2MSL),被动方收到后进入CLOSED

IME_WAIT状态的作用

  • 防止最后一个ACK丢失:若被动关闭方未收到ACK,会重发FIN,主动方可在TIME_WAIT内再次回复。
  • 避免旧连接干扰新连接:确保旧连接的所有报文段在网络中消失(MSL为最大报文段生存时间,通常1-2分钟)。

4.网络层协议——IP

在 IP 的报文中有 源地址和目标地址的 信息,这个信息就是上面通过 DNS 解析得到的 IP 地址,它从应用层传递下来,最终被包含在 IP 的报文中。

参考以下内容:

https://blog.csdn.net/weixin_74895237/article/details/136682152

https://blog.csdn.net/zx_emily/article/details/83024065

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐