<返回更多

HTTP协议通信原理

2019-10-24    
加入收藏

负责域名解析的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 状态。

假设 Client 端发起中断连接请求,也就是发送 FIN 报文。Server 端接到 FIN 报文后,意思是说"我 Client 端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送 ACK,"告诉 Client 端,你的请求我收到了,但是我还没准备好,请继续你等我的消息"。这个时候 Client 端就进入 FIN_WAIT 状态,继续等待Server 端的 FIN 报文。当 Server 端确定数据已发送完成,则向 Client 端发送 FIN 报文,"告诉 Client 端,好了,我这边数据发完了,准备好关闭连接了"。Client 端收到 FIN 报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕 Server 端不知道要关闭,所以发送 ACK 后进入 TIME_WAIT 状态,如果 Server 端没有收到 ACK 则可以重传。“,Server 端收到 ACK 后,"就知道可以断开连接了"。Client 端等待了 2MSL 后依然没有收到回复,则证明 Server 端已正常关闭,那好,我 Client 端也可以关闭连接了。Ok,TCP 连接就这样关闭了!

【问题 1】为什么连接的时候是三次握手,关闭的时候却是四次握手?

答:三次握手是因为因为当 Server 端收到 Client 端的 SYN 连接请求报文后,可以直接发送SYN+ACK 报文。其中 ACK 报文是用来应答的,SYN 报文是用来同步的。但是关闭连接时,当 Server 端收到 FIN 报文时,很可能并不会立即关闭 SOCKET(因为可能还有消息没处理完),所以只能先回复一个 ACK 报文,告诉 Client 端,"你发的 FIN 报文我收到了"。只有等到我 Server 端所有的报文都发送完了,我才能发送 FIN 报文,因此不能一起发送。故需要四步握手。

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>