- 浏览器对url进行解析(生成发送给web服务器的请求信息)
生成http请求信息:
请求行( 请求方法字段、URL字段和HTTP协议版本)GET /index.html HTTP/1.1
消息头(key-value形式) User-Agent:产生请求的浏览器类型、 Accept:客户端可识别的内容类型列 表。 、 Host:主机地址(就是一些http字段)
消息体:如果是get消息体为空。
扩展响应报文:响应报文(状态行、消息报头、响应正文)
状态行
消息报头
响应正文
- 请求DNS服务器,通过DNS解析出web服务器对应的ip地址
他会先去看有没有对这个域名的缓存(浏览器、操作系统、host文件中都可能会缓存).
没有:比如www.server.com。通过根域名服务器去找.com,然后去找顶级域 DNS 服务器.com, 然后去找权威 DNS 服务器(server.com)然后解析出对应的ip。
- 应用程序通过调用Socket库,来委托操作系统协议栈工作。
调用 Sockect 库提供的 socket 系统调用,创建并初始化套接字。
协议栈先将收到的数据写到缓存区,协议栈根据MTU(网络包最大长度)减去头部长度,得到单个包的长 度, 对缓冲区数据进行拆分,然后将拆分的数据逐个发送。(不足一个包到达计时器时间后协议会立即发送)
协议调用TCP模块创建TCP头部(TCP头部:源端口、目的端口、序号、确认序号、首部长度、保留、urg、 ack、psh、rst、syn、fin、窗口大小、校验和、紧急指针、选项)。
TCP模块将消息传给IP模块,并委托IP模块进行发送。
IP模块添加IP头部和以太网头部,分别存储ip地址和下一跳路由器MAC地址。
怎么确定源ip地址:根据路由表来判断哪一个网卡作为源地址ip。首先将目标地址和第一条子网掩码进 行与运算,看目的地址与路由表上的目的地址是不是一样,不是对下一条进行重复操作。如果都不能就 会匹配默认网关地址(路由器的 IP 地址)。目的地址在域名解析的时候就已经拿到了。
接收方的MAC地址如何确认:首先会去ARP缓存中查询。没有ARP 协议帮我们找到路由器的 MAC 地址。ARP 协议会在以太网中对以太网所有的设备进行广播这个ip地址,然后就会由设备 回应MAC地址。
- 通过网卡驱动程序操作网卡将其复制到网卡内的缓存区中,接着会在其开头加上报文段和起始帧分界符,在末尾加上用于检测错误的帧校验序列。将包转为电信号,通过网线发送出去
- 电信号到达网线接口,交换机进行接收。将电信号转换成数字信号。先检验包末尾FCS。没问题放入缓冲区。查询MAC地址表是否有该记录(表中有MAC地址和端口)。
- 有就将包发送到对应的端口。
- 如果没有只能将包转发到除了源端口之外的所有端口上,无论该设备连接在哪个端口上都能收到这个包。这样做不会产生什么问题,因为以太网的设计本来就是将包发送到整个网络的,然后只有相应的接收者才接收包,而其他设备则会忽略这个包。
- 经过交换机后会到达路由器。电信号到达网线接口部分,路由器中的模块会将电信号转成数字信号,然后通过包末尾的 FCS 进行错误校验。
- 如果没问题则检查 MAC 头部中的接收方 MAC 地址,看看是不是发给自己的包,如果是就放到接收缓冲区中,否则就丢弃这个包。
- 完成包接收操作之后,路由器就会去掉包开头的 MAC 头部。路由器会根据 IP 头部中的内容进行包的转发操作。
- 首先是查询路由表判断转发目标。路由匹配和前面讲的一样,和路由表的每一条子网掩码进行与运算,与目标地址进行匹配。都匹配不到会选择默认路由。然后看表中对应的网关是空还是ip地址。如果是空代表到了终点。否则还要进行路由转发。
- 然后根据ARP协议将查询到的ip解析成MAC地址。路由器也有 ARP 缓存,因此首先会在 ARP 缓存中查询,如果找不到则发送 ARP 查询请求。然后修改源MAC地址和目的MAC地址,发送网络包,通过交换机到达下一个路由器。
- 到达目的地。
- 服务器会先扒开数据包的 MAC 头部,查看是否和服务器自己的 MAC 地址符合,符合就将包收起来。
- 扒开数据包的 IP 头,发现 IP 地址符合,根据 IP 头中协议项,知道自己上层是 TCP 协议。
- 扒开 TCP 的头,里面有序列号,需要看一看这个序列包是不是我想要的,如果是就放入缓存中然后返回一个 ACK,如果不是就丢弃。TCP头部里面还有端口号, HTTP 的服务器正在监听这个端口号。
- 服务器自然就知道是 HTTP 进程想要这个包,于是就将包发给 HTTP 进程服务器的 HTTP 进程看到,原来这个请求是要访问一个页面,于是就把这个网页封装在 HTTP 响应报文里。
- HTTP 响应报文也需要加上 TCP、IP、MAC 头部,不过这次是源地址是服务器 IP 地址,目的地址是客户端 IP 地址。
- 和之气一样转发操作
- HTTP 响应报文后,交给浏览器去渲染页面,一份特别的数据包快递,就这样显示出来了!最后,客户端要离开了,向服务器发起了 TCP 四次挥手,至此双方的连接就断开了。