HTTP
浏览器第一步工作就是对URL进行解析,从而生成发送给Web服务器的请求信息。
如果没有路径名时,就代表访问根目录下实现设置的默认文件,也就是/index.html 或者/default.html 这些文件, 这样就不会发生混乱。
生成HTTP请求信息
对URL进行解析之后,浏览器确定了Web 服务器和文件名,接下来就是对这些信息来生成HTTP请求信息了。
真实地址查询 —— DNS
在向web 服务器发送消息的时候需要查询服务器域名对应的IP地址,所以委托操作系统发送消息的时候,必须提供通信对象的IP地址,有一种服务器专门保存了Web 服务器域名与IP 的对应关系,他就是DNS服务器。域名的层级关系类似一个树状结构,1、根DNS 服务器 2、顶级域 DNS 服务器(com) 3、权威 DNS 服务器
协议栈
通过 DNS 获取到IP 后,就可以把HTP的传输工作交给操作系统中的协议栈
协议栈的内部分为几个部分,上下关系是有一定规律的,上面的部分会向下面的部分委托工作,下面的部分受到委托的工作并执行。
应用程序(浏览器)通过Socket库,来委托协议栈工作,协议栈的上半部分有两块,分别是复制数据的TCP和UDP协议,他们俩会接受应用层的委托执行收发数据的操作。
协议栈的下面一半是用IP协议控制网络包的收发操作,在互联网上传数据时,数据会被切分成一块一块的网络包,而降网络包发送给对方的操作就是IP负责的。
其中IP 还包括ICMP 协议和ARP 协议。
IP 线面的网卡驱动程序负责网卡的硬件,而最下面的网卡则负责实际收发操作,也就是对网线中的信号执行发送和接收操作。
可靠传输————TCP
TCP 的报文头部格式:
- 源端口号和目标端口号是不可少的,如果没有这两个端口号,数据就不知道发给哪个应用。
- 包的序号,为了解决包乱序问题
- 包的确认号,目的是确认发出去对方是否有收到,如果没有收到,那么就重新发送,直到发送到达,这个是为了解决不丢包的问题
- 还有一些状态位,例如SYN 是发起一个连接,ACK 是回复,RST 是重新连接,FIN 是结束连接,等等,TCP是面向连接的,因为双方要维护连接的状态,这些带状态位的包的发送,会引起双方的状态变更。
- 还有一个重要的就是窗口大小,TCP要做流量控制,通信双方各声明一个窗口(缓存大小)标识自己当前能够的处理能力。
- 除了做流量控制之外,TCP还会做拥塞控制。
如果HTTP 的请求消息比较长,超过了MSS的长度,这时TCP就需要把HTTP的数据拆解为一块块的数据而不是一次性的发送所有数据。
MTU:一个网络包的最大长度,以太网中一般为1500字节
MSS:除去IP和TCP头部之后,一个网络包能容纳的TCP数据的最大长度。
被拆分的数据包加上了TCP 头部信息,然后交给IP模块来发送数据。
远程定位 ———— IP
TCP模块在执行连接、收发、断开等各阶段操作时,都需要委托IP模块将数据封装成网络包发送给通信对象。
IP 协议里面需要有 源地址IP 和 目标地址IP
黄土坡是经过TCP 传输的,所以在IP 报头的协议号,需要填写06(十六进制),表示协议为TCP
两点传输————MAC
生成了IP 头部之后,接下来网络包还需要在IP头部加上MAC头部。
MAC 头部是以太网使用的头部,他包含了接收方和发送方的MAC地址等信息。
在MAC报头里需要发送方的MAC地址和接收方的MAC地址,用于两点之间的传输。一般MAC报文的协议类型只使用: 0800 IP协议, 0806 ARP协议。
发送的MAC 地址往往ARP协议。
出口————网卡
网卡驱动从IP模块中获取包之后,会将其复制到网卡的缓存中,接着会在其开头加上报头和起始帧分解符,在末尾加上检测错误的帧校验序列。我们需要将数字信号转换为电信号,才可以在网线上传输,
- 起始帧分解符是一个用来表示包起始位置的标记
- 末尾的 FCS 用来检查包传输过程中是否有损坏
交换机————送别者
交换机的端口不具有MAC 地址,交换机将电信号转换为数字信号,然后通过包的FCS校验错误,如果没有问题则放到缓冲区,这部分操作基本与计算机的网卡差不多。交换机的MAC地址表主要包含两个信息:
- 一个是设备的MAC地址
- 一个是该设备连接在交换机的那个端口上。
所以交换机根据MAC地址表查找MAC 地址,然后将信号发送到相应的端口。
路由器
路由器的端口具有MAC地址,因此它能够成为以太网的发送方和接收方;同时还具有IP 地址,从这个意义上来说,它和计算机的网卡是一样的。
当转发包时,首先路由器端口会接受发给自己的以太网包,然后路由表查询转发目标,再由相应的端口作为发送方将以太网包发送出去。
- 路由器的包接受操作
++ 首先电信号到达网线接口部分,路由器中的模块会将电信号转换为数字信号,然后通过包末尾的FCS进行错误校验
++ 如果没有问题则检查MAC头部中的接收方MAC地址,看看是不是发给自己的包,如果是就放到接受缓冲区中,否则就丢弃这个包 - 查询路由表确定输出端口
MAC 头部的作用就是将包送达路由器,其中的接收方的MAC地址就是路由器端口的MAC地址。因此当包到达路由器之后,MAC头部的任务就完成了,于是MAC 头部就会被丢弃, 接下来路由器会根据MAC头部后方的IP头部中的内容进行包的转发操作。
转发操作分为几个阶段,首先是查询路由表判断转发目标:
每个条目的子网掩码和目标IP进行与运算之后,得到的结果与对应条目的目标地址进行匹配,如果匹配就会作为候选转发目标,如果不匹配就继续与下个条目进行路由匹配。实在找不到路由时,就会选择默认路由,路由表中的子网掩码为0.0.0.0表示默认路由。 - 如果网关是一个IP地址,则这个IP 地址就是我们要转发到的目标地址,还未抵达终点,还需要继续由路由器转发
- 如果网关为空,说明IP欧布中的接收方IP地址就是我们要转发到的目标地址,也就是说到达了目标点。
在整个过程中源IP和目标IP是始终不变的,一直变化的是MAC 地址,因为需要MAC地址在以太网内进行两个设备之间的传输。