HTTP协议通信原理

负责域名解析的DNS 服务
首先,用户访问一个域名,会经过 DNS 解析DNS(Domain Name System),它和 HTTP 协议一样是位于应用层的协议,主要提供域名到IP 的解析服务 。我们其实不用域名也可以访问目标主机的服务,但是 IP 本身不是那么容易记,所以使用域名进行替换使得用户更容易记住 。

HTTP协议通信原理

文章插图
 
HTTP 协议通信原理
域名被成功解析以后,客户端和服务端之间,是怎么建立连接并且如何通信的呢?说到通信,大家一定听过 tcp 和 udp 这两种通信协议,以及建立连接的握手过程 。而 http 协议的通信是基于 tcp/ip 协议之上的一个应用层协议,应用层协议除了 http 还有哪些呢(FTP、DNS、SMTP、Telnet 等) 。
涉及到网络协议,我们一定需要知道 OSI 七层网络模型和 TCP/IP 四层概念模型,OSI 七层网络模型包含(应用层、表示层、会话层、传输层、网络层、数据链路层、物理层)、TCP/IP 四层概念模型包含(应用层、传输层、网络层、数据链路层) 。
HTTP协议通信原理

文章插图
 
请求发起过程中,在 tcp/ip 四层网络模型中所做的事情
当应用程序用 T C P 传送数据时,数据被送入协议栈中,然后逐个通过每一层直到被当作一串比特流送入网络 。其中每一层对收到的数据都要增加一些首部信息(有时还要增加尾部信息)
HTTP协议通信原理

文章插图
 
接收端收到数据包以后的处理过程
当目的主机收到一个以太网数据帧时,数据就开始从协议栈中由底向上升,同时去掉各层协议加上的报文首部 。每层协议都要去检查报文首部中的协议标识,以确定接收数据的上层协议 。
HTTP协议通信原理

文章插图
 
TCP/IP 协议的深入分析
TCP 握手协议
所以 TCP 消息的可靠性首先来自于有效的连接建立,所以在数据进行传输前,需要通过三次握手建立一个连接,所谓的三次握手,就是在建立 TCP 链接时,需要客户端和服务端总共发送 3 个包来确认连接的建立,在 socket 编程中,这个过程由客户端执行 connect 来触发
HTTP协议通信原理

文章插图
 
第 一 次 握 手(SYN=1, seq=x)客 户 端 发 送 一 个TCP 的 SYN 标志位置 1 的包,指明客户端打算连接的服务器的端口,以及初始序号 X ,保存在 包 头 的 序 列 号(Sequence
Number)字段里。发送完毕后,客户端 进 入SYN_SEND 状态 。
第 二 次 握 手(SYN=1, ACK=1,seq=y,ACKnum=x+1):服务器发回确认包(ACK) 应 答。即SYN 标 志 位 和ACK 标志位均为1 。服务器端选择自己 ISN 序列号,放到 Seq 域里,同时将 确 认 序 号(Acknowledgement Number)设置为客户的 ISN 加 1,即 X+1 。发送完毕后,服务器 端 进 入SYN_RCVD 状态 。
第 三 次 握 手(ACK=1,ACKnum=y+1)客户端再次发送确认包(ACK),SYN 标志位为 0,ACK 标志位为 1,并且把服务器发来 ACK 的序号字段+1,放在确定字段中发送给对方,并且在数据段放写 ISN 发完毕后,客 户 端 进 入ESTABLISHED 状态,当服务器端接收到这个包时,也进 入ESTABLISHED 状态,TCP 握手结束 。
TCP 四次挥手协议
四次挥手表示 TCP 断开连接的时候,需要客户端和服务端总共发送 4 个包以确认连接的断开;客户端或服务器均可主动发起挥手动作(因为 TCP 是一个全双工协议),在 socket 编程中,任何一方执行 close() 操作即可产生挥手操作 。
HTTP协议通信原理

文章插图
 
第一次挥手(FIN=1,seq=x)假设客户端想要关闭连接,客户端发送一个 FIN 标志位置为 1 的包,表示自己已经没有数据可以发送了,但是仍然可以接受数据 。发送完毕后,客户端进入 FIN_WAIT_1 状态 。
第二次挥手(ACK=1,ACKnum=x+1)服务器端确认客户端的 FIN 包,发送一个确认包,表明自己接受到了客户端关闭连接的请求,但还没有准备好关闭连接 。发送完毕后,服务器端进入 CLOSE_WAIT 状态,客户端接收到这个确认包之后,进入 FIN_WAIT_2 状态,等待服务器端关闭连接 。
第三次挥手(FIN=1,seq=w)服务器端准备好关闭连接时,向客户端发送结束连接请求,FIN 置为 1 。发送完毕后,服务器端进入 LAST_ACK 状态,等待来自客户端的最后一个 ACK 。
第四次挥手(ACK=1,ACKnum=w+1)客户端接收到来自服务器端的关闭请求,发送一个确认包,并进入 TIME_WAIT 状态,等待可能出现的要求重传的 ACK 包 。服务器端接收到这个确认包之后,关闭连接,进入 CLOSED 状态 。客户端等待了某个固定时间(两个最大段生命周期,2MSL,2 Maximum Segment Lifetime)之后,没有收到服务器端的 ACK,认为服务器端已经正常关闭连接,于是自己也关闭连接,进入 CLOSED 状态 。


推荐阅读