一、解析HTTP网址(URL)
如:http://www.server.com/dir1/file1.html
http:------表示使用的是http协议
//-----------后面跟服务器名称
www.server.com---服务器名称
/dir1/file1.html----表示文件夹名称
二、生成HTTP请求
请求报文:请求行+消息头+消息体组成
响应报文:状态行+消息头+消息体组成
三、查询服务器IP地址--DNS寻址
1.本地客户端询问本地DNS服务器
2.本地DNS服务器询问.根域,返回下一级路径.com名称
本地DNS服务器询问.com,返回下一级路径www.server.com名称
本地DNS服务器询问www.server.comIP地址,返回IP地址
本地DNS服务器提交IP地址给本地客户端
四、调用socket库
委托协议栈工作。
协议栈的上半部分有两块,分别是负责收发数据的 TCP 和 UDP 协议,这两个传输协议会接受应用层的委托执行收发数据的操作。
协议栈的下面一半是用 IP 协议控制网络包收发操作,在互联网上传数据时,数据会被切分成一块块的网络包,而将网络包发送给对方的操作就是由 IP 负责的。
五、TCP协议传输
1.TCP建立连接(三次握手)--保证客户端和服务器端的可靠连接
三次握手目的:为了确认双方的接收能力和发送能力是否正常
-
一开始,客户端和服务端都处于
CLOSED
状态。先是服务端主动监听某个端口,处于LISTEN
状态。 -
然后客户端主动发起连接
SYN
,之后处于SYN-SENT
状态。 -
服务端收到发起的连接,返回
SYN
,并且ACK
客户端的SYN
,之后处于SYN-RCVD
状态。 -
客户端收到服务端发送的
SYN
和ACK
之后,发送对SYN
确认的ACK
,之后处于ESTABLISHED
状态,因为它一发一收成功了。 -
服务端收到
ACK
的ACK
之后,处于ESTABLISHED
状态,因为它也一发一收了。
第一次A---->B:证明客户端的发送能力正常
第二次B---->A:证明服务器端的接收和发送能力正常
第三次A---->B:证明客户端的接收能力正常
两次握手错误情况举例:如果客户端第一次发送请求,但是服务器端没有收到,此时请求报文失效;客户端再次向服务器端发送请求,之后客户端与服务器建立连接,这条请求突然到达服务器端,服务器误认为客户端又发送了连接请求,两次握手建立连接,而客户端忽略服务器发来的确定,也不发送数据,造成不必要的错误和网络资源的浪费。
2.TCP报文格式
SYN是发起一个连接,ACK是回复,RST是重新连接,FIN是结束连接
接收窗口:TCP要做流量控制,通信双方各声明一个窗口(缓存大小),标识自己当前能够的处理能力。
TCP还有拥塞控制,即当拥塞之后,控制自己发送的速度。
3.在linux下,可以通过netstat -napt命令查看当前连接状态
4.TCP分割数据
如果HTTP请求消息超过MSS的长度,TCP就会把HTTP的数据拆解为数据块发送,而不是一次性发送。拆分出来的每个数据块都会加上TCP头部信息,然后交给IP模块来发送数据。
5.TCP报文生成
TCP 协议里面会有两个端口,一个是浏览器监听的端口(通常是随机生成的),一个是 Web 服务器监听的端口(HTTP 默认端口号是 80
, HTTPS 默认端口号是 443
)。
最后组装为TCP头部+HTTP头部+数据发送到网络层处理。
六、网络层-IP定位
TCP 模块在执行连接、收发、断开等各阶段操作时,都需要委托 IP 模块将数据封装成网络包发送给通信对象。
1.IP报文格式
协议号:06(十六进制)---表示协议是TCP
源地址:客户端输出的IP地址
目的地址:通过DNS域名解析得到的Web服务器IP
注*如果客户端有多个网卡(即有多个IP地址),如何判断使用哪一个
需要根据路由表规则,来判断哪一个网卡作为源地址 IP。
七、网络接口层--MAC两点传输
网络包还需要在IP头部加上MAC头部
MAC头部信息:接收方MAC地址(48位)
发送方MAC地址(48位)-----在客户端网卡ROM中
协议类型(16位):0800(IP协议)、0806(ARP协议)
问题:如何获取接收方的MAC地址呢?
由ARP协议帮我们找到路由器的MAC地址
具体实现:
ARP 协议会在以太网中以广播的形式,对以太网所有的设备喊出:“这个 IP 地址是谁的?请把你的 MAC 地址告诉我”。
然后就会有人回答:“这个 IP 地址是我的,我的 MAC 地址是 XXXX”。
八、网卡发送
将上述最终的数字信息转化为电信号在网线上传输
完成这一步的是网卡驱动程序,在上述网络包复制到网卡的缓存区,并在开头加上报头和起始帧分界符,在末尾加上用于错误检测的帧校验序列。
九、交换机-二层网络设备
首先,电信号到达网线接口,交换机里的模块进行接收,接下来交换机里的模块将电信号转换为数字信号。然后通过包末尾的 FCS
校验错误,如果没问题则放到缓冲区。
交换机主要工作:交换机根据 MAC 地址表查找 MAC 地址,然后将信号发送到相应的端口。
交换机的端口不核对接收方 MAC 地址,而是直接接收所有的包并存放到缓冲区中。因此,和网卡不同,交换机的端口不具有 MAC 地址。
交换机的 MAC 地址表主要包含两个信息:
- 一个是设备的 MAC 地址(接收方)
- 另一个是该设备连接在交换机的哪个端口上。
如果接收方 MAC 地址是一个广播地址,那么交换机会将包发送到除源端口之外的所有端口。
十、路由器-三层网络设备
二层网络设备和三层网络设备区别是有没有自己的MAC地址。
首先,电信号到达网线接口部分,路由器中的模块会将电信号转成数字信号,然后通过包末尾的 FCS
进行错误校验。
如果没问题则检查 MAC 头部中的接收方 MAC 地址,看看是不是发给自己的包,如果是就放到接收缓冲区中,否则就丢弃这个包。
接收:
去掉网络包开头的MAC头部,然后根据后方的IP头部内容进行包的转发操作。
不接收:
根据路由表的网关列判断对方的地址。
接下来需要通过 ARP
协议根据 IP 地址查询 MAC 地址,并将查询的结果作为接收方 MAC 地址。
然后重复网卡发送----交换机到达下一个路由器
十一、到达服务器
一层一层去除头部,如果里面的不是自己匹配的信息,就重新加头部发送。
如果是就会将这个包发送HTTP进程,然后从服务器端重复上面操作到达客户端。
客户端接收完成之后,向服务器发起四次挥手,断开连接。
- 第一步:客户端进程发出断开连接指令,这将导致客户端的
TCP
程序创建一个特殊的TCP
报文段,发送到服务器。这个报文段的FIN
字段被置为1,表示这是一条断开连接的报文; - 第二步:服务器接收到客户端发来的断开连接报文,向客户端回送这个报文的确认报文(
ACK
字段为1
),告诉服务器已经接收到FIN
报文,并允许断开连接; - 第三步:服务器发送完确认报文后,服务器的
TCP
程序创建一条自己的断开连接报文,此报文的FIN
字段被置为1
,然后发往客户端; - 第四步:客户端接收到服务器发来的
FIN
报文段,则产生一条确认报文(ACK
为1
),发送给服务器,告知服务器已经接收到了它的断开报文。服务器接收到这条ACK
报文段后,释放TCP
连接相关的资源(缓存和变量),而客户端等待一段时间后(半分钟、一分钟或两分钟),也释放处于客户端的缓存和变量;