目录

网络是怎样连接的

生成 HTTP 请求消息

  1. 浏览器输入网址
  2. 浏览器先要解析 URL(有 http:、file:、ftp:、news:、mailto:等协议),获取域名
  3. 生成 HTTP 请求消息(请求行、请求头、空行、消息报文)

注意:1 条请求消息中只能写 1 个 URI。如果需要获取多个文件,必须对每个文件单独发送 1 条请求。

DNS 解析 IP 地址 

  1. 查看浏览器缓存
  2. 查看系统缓存(hosts 文件里面的 ip)
  3. 查看路由器缓存
  4. 查看 ISP(也就是本地域名服务器,一般都是你的网络接入服务器商提供,比如中国电信,中国移动等) DNS 缓存
  5. 由 ISP 询问根域名服务器
  6. 询问顶级域名服务器
  7. 询问权威域名(主域名)服务器
  8. 保存结果至缓存:本地域名服务器把返回的结果保存到缓存,以备下一次使用,同时将该结果反馈给客户端,客户端通过这个 IP 地址即可访问目标 Web 服务器。

域名和 IP 地址并用的理由:

  • IP 地址不方便记忆,网址中用域名更好
  • 路由器中的路由表会需要根据 IP 地址来传送到什么地方,如果用域名代替 IP 地址,占用空间会很大。

创建套接字

创建套接字创建套接字(创建套接字阶段),首先分配一个套接字所需的内存空间,然后向其中写入初始状态。

建立连接

将管道连接到服务器端的套接字上(连接阶段)

  1. 连接操作的第一步是在 TCP 模块处创建表示连接控制信息的头部。
  2. 通过 TCP 头部中的发送方和接收方端口号可以找到要连接的套接字。

IP 地址和端口号:客户端和服务器之间用来识别对方套接字的机制

描述符:应用程序用来识别套接字的机制,使用描述符来指代套接字的原因如下:

  1. 等待连接的套接字中没有客户端 IP 地址和端口号
  2. 使用描述符这一种信息比较简单

TCP 收发数据  

  1. 将 HTTP 请求消息交给协议栈
  2. 对较大的数据进行拆分
  3. 使用 ACK 号确认网络包已收到
  4. 根据网络包平均往返时间调整 ACK 号等待时间
  5. 使用窗口有效管理 ACK 号
  6. ACK 与窗口的合并
  7. 接收 HTTP 响应消息

MTU:一个网络包的最大长度,以太网中一般为 1500 字节。

MSS:除去头部之后,一个网络包所能容纳的 TCP 数据的最大长度。

IP 与以太网的包收发操作

  1. 生成包含接收方 IP 地址的 IP 头部
  2. 生成以太网用的 MAC 头部
  3. 通过 ARP 查询目标路由器的 MAC 地址
  4. 将 IP 包转换成电或光信号
  5. 给网络包再加 3 个控制数据(报头、起始帧分界符、帧校验序列)
  6. 向集线器发送网络包
  7. 接收返回包
  8. 将服务器的响应包从 IP 层传递给 TCP 层

IP 模块负责添加如下两个头部。

  • MAC 头部:以太网用的头部,包含 MAC 地址
  • IP 头部:IP 用的头部,包含 IP 地址

从网线到网络设备-探索集线器、交换机和路由器

  1. 信号在网线和集线器中传输
  2. 交换机根据地址表进行转发

交换机端口的 MAC 模块不具有 MAC 地址。

交换机根据 MAC 地址表查找 MAC 地址,然后将信号发送到相应的端口。

路由器的各个端口都具有 MAC 地址和 IP 地址。

  1. 路由器的包接收(路由器的端口都具有 MAC 地址,只接收与自身地址匹配的包,遇到不匹配的包则直接丢弃。)
  2. 路由器的包转发,路由器判断下一个转发目标的方法如下:
    1. 根据包的接收方 IP 地址查询路由表中的目标地址栏,以找到相匹配的记录。
    2. 这个匹配并不是匹配全部 32 个比特,而是根据子网掩码列中的值判断网络号的比特数,并匹配相应数量的比特。
    3. 会匹配到多条候选记录,路由器寻找网络号比特数最长的一条记录。
    4. 如果存在网络号长度相同的多条记录,则根据跃点数匹配,跃点计数越小说明该路由越近,因此应选择跃点计数较小的记录。
    5. 路由器也会使用 ARP 来查询下一个转发目标的 MAC 地址。
    6. 找不到匹配路由时选择默认路由(路由表中子网掩码为 0.0.0.0 的记录表示“默认路由”。)
    7. 如果在路由表中无法找到匹配的记录,路由器会丢弃这个包,并通过 ICMP 消息告知发送方。

注意:路由器也会使用 ARP 来查询下一个转发目标的 MAC 地址。

通过接入网进入互联网内部  

  1. ADSL 接入网
  2. 光纤接入网(FTTH)
  3. 网络包通过接入网之后,到达运营商 POP(接入点)的路由器。
  4. 接着进入 NOC(网络运营中心,某运营商的)
  5. 通过 IX(互联网交互中心)到达其他运营商

进入服务端的局域网

  1. 经过防火墙,过滤规则如下
    1. 发送方 MAC 地址
    2. 发送方 IP 地址、接收方 IP 地址、协议号
    3. 发送方端口号、接收方端口号、TCP 控制位、分片
    4. ICMP 消息类型
  2. 通过 DNS 轮询将请求派发到不同的服务器
  3. 使用缓存服务器(CDN、反向代理 nginx 也可)分担负载

服务器接收

  1. 网卡将接收到的信号转换成数字信息
    1. 网卡的 MAC 模块将网络包从信号还原为数字信息,校验 FCS 并存入缓冲区。
    2. 网卡驱动会根据 MAC 头部判断协议类型,并将包交给相应的协议栈。
  2. IP 模块的接收操作
    1. 协议栈的 IP 模块会检查 IP 头部,(1)判断是不是发给自己的;(2)判断网络包是否经过分片;(3)将包转交给 TCP 模块或 UDP 模块。
  3. TCP 模块处理连接包
    1. 如果收到的是发起连接的包,则 TCP 模块会(1)确认 TCP 头部的控制位 SYN;(2)检查接收方端口号;(3)为相应的等待连接套接字复制一个新的副本;(4)记录发送方 IP 地址和端口号等信息。
  4. 断开操作完成后,套接字会在经过一段时间后被删除。

服务器响应

  1. URI 指定的是文件(html、图片等)则直接返回文件
  2. URI 指定的是 CGI 或者其他程序则由程序返回具体内容
  3. 返回响应消息

浏览器接收响应消息并显示内容  

  1. 通过响应的数据类型判断其中的内容
  2. 如果是 html,浏览器需要解析 html,并请求 html 代码中的资源(如 js、css、图片等)
  3. 浏览器对页面进行渲染呈现给用户
  4. 断开连接,删除套接字

从服务器断开并删除套接字  

  1. 数据发送完毕后断开连接
  2. 删除套接字

参考

《网络是怎样连接的》

https://www.sfn.cn/news/technology/detail/222.html