网络是怎样连接的
目录
生成 HTTP 请求消息
- 浏览器输入网址
- 浏览器先要解析 URL(有 http:、file:、ftp:、news:、mailto:等协议),获取域名
- 生成 HTTP 请求消息(请求行、请求头、空行、消息报文)
注意:1 条请求消息中只能写 1 个 URI。如果需要获取多个文件,必须对每个文件单独发送 1 条请求。
DNS 解析 IP 地址
- 查看浏览器缓存
- 查看系统缓存(hosts 文件里面的 ip)
- 查看路由器缓存
- 查看 ISP(也就是本地域名服务器,一般都是你的网络接入服务器商提供,比如中国电信,中国移动等) DNS 缓存
- 由 ISP 询问根域名服务器
- 询问顶级域名服务器
- 询问权威域名(主域名)服务器
- 保存结果至缓存:本地域名服务器把返回的结果保存到缓存,以备下一次使用,同时将该结果反馈给客户端,客户端通过这个 IP 地址即可访问目标 Web 服务器。
域名和 IP 地址并用的理由:
- IP 地址不方便记忆,网址中用域名更好
- 路由器中的路由表会需要根据 IP 地址来传送到什么地方,如果用域名代替 IP 地址,占用空间会很大。
创建套接字
创建套接字创建套接字(创建套接字阶段),首先分配一个套接字所需的内存空间,然后向其中写入初始状态。
建立连接
将管道连接到服务器端的套接字上(连接阶段)
- 连接操作的第一步是在 TCP 模块处创建表示连接控制信息的头部。
- 通过 TCP 头部中的发送方和接收方端口号可以找到要连接的套接字。
IP 地址和端口号:客户端和服务器之间用来识别对方套接字的机制
描述符:应用程序用来识别套接字的机制,使用描述符来指代套接字的原因如下:
- 等待连接的套接字中没有客户端 IP 地址和端口号
- 使用描述符这一种信息比较简单
TCP 收发数据
- 将 HTTP 请求消息交给协议栈
- 对较大的数据进行拆分
- 使用 ACK 号确认网络包已收到
- 根据网络包平均往返时间调整 ACK 号等待时间
- 使用窗口有效管理 ACK 号
- ACK 与窗口的合并
- 接收 HTTP 响应消息
MTU:一个网络包的最大长度,以太网中一般为 1500 字节。
MSS:除去头部之后,一个网络包所能容纳的 TCP 数据的最大长度。
IP 与以太网的包收发操作
- 生成包含接收方 IP 地址的 IP 头部
- 生成以太网用的 MAC 头部
- 通过 ARP 查询目标路由器的 MAC 地址
- 将 IP 包转换成电或光信号
- 给网络包再加 3 个控制数据(报头、起始帧分界符、帧校验序列)
- 向集线器发送网络包
- 接收返回包
- 将服务器的响应包从 IP 层传递给 TCP 层
IP 模块负责添加如下两个头部。
- MAC 头部:以太网用的头部,包含 MAC 地址
- IP 头部:IP 用的头部,包含 IP 地址
从网线到网络设备-探索集线器、交换机和路由器
- 信号在网线和集线器中传输
- 交换机根据地址表进行转发
交换机端口的 MAC 模块不具有 MAC 地址。
交换机根据 MAC 地址表查找 MAC 地址,然后将信号发送到相应的端口。
路由器的各个端口都具有 MAC 地址和 IP 地址。
- 路由器的包接收(路由器的端口都具有 MAC 地址,只接收与自身地址匹配的包,遇到不匹配的包则直接丢弃。)
- 路由器的包转发,路由器判断下一个转发目标的方法如下:
- 根据包的接收方 IP 地址查询路由表中的目标地址栏,以找到相匹配的记录。
- 这个匹配并不是匹配全部 32 个比特,而是根据子网掩码列中的值判断网络号的比特数,并匹配相应数量的比特。
- 会匹配到多条候选记录,路由器寻找网络号比特数最长的一条记录。
- 如果存在网络号长度相同的多条记录,则根据跃点数匹配,跃点计数越小说明该路由越近,因此应选择跃点计数较小的记录。
- 路由器也会使用 ARP 来查询下一个转发目标的 MAC 地址。
- 找不到匹配路由时选择默认路由(路由表中子网掩码为 0.0.0.0 的记录表示“默认路由”。)
- 如果在路由表中无法找到匹配的记录,路由器会丢弃这个包,并通过 ICMP 消息告知发送方。
注意:路由器也会使用 ARP 来查询下一个转发目标的 MAC 地址。
通过接入网进入互联网内部
- ADSL 接入网
- 光纤接入网(FTTH)
- 网络包通过接入网之后,到达运营商 POP(接入点)的路由器。
- 接着进入 NOC(网络运营中心,某运营商的)
- 通过 IX(互联网交互中心)到达其他运营商
进入服务端的局域网
- 经过防火墙,过滤规则如下
- 发送方 MAC 地址
- 发送方 IP 地址、接收方 IP 地址、协议号
- 发送方端口号、接收方端口号、TCP 控制位、分片
- ICMP 消息类型
- 通过 DNS 轮询将请求派发到不同的服务器
- 使用缓存服务器(CDN、反向代理 nginx 也可)分担负载
服务器接收
- 网卡将接收到的信号转换成数字信息
- 网卡的 MAC 模块将网络包从信号还原为数字信息,校验 FCS 并存入缓冲区。
- 网卡驱动会根据 MAC 头部判断协议类型,并将包交给相应的协议栈。
- IP 模块的接收操作
- 协议栈的 IP 模块会检查 IP 头部,(1)判断是不是发给自己的;(2)判断网络包是否经过分片;(3)将包转交给 TCP 模块或 UDP 模块。
- TCP 模块处理连接包
- 如果收到的是发起连接的包,则 TCP 模块会(1)确认 TCP 头部的控制位 SYN;(2)检查接收方端口号;(3)为相应的等待连接套接字复制一个新的副本;(4)记录发送方 IP 地址和端口号等信息。
- 断开操作完成后,套接字会在经过一段时间后被删除。
服务器响应
- URI 指定的是文件(html、图片等)则直接返回文件
- URI 指定的是 CGI 或者其他程序则由程序返回具体内容
- 返回响应消息
浏览器接收响应消息并显示内容
- 通过响应的数据类型判断其中的内容
- 如果是 html,浏览器需要解析 html,并请求 html 代码中的资源(如 js、css、图片等)
- 浏览器对页面进行渲染呈现给用户
- 断开连接,删除套接字
从服务器断开并删除套接字
- 数据发送完毕后断开连接
- 删除套接字