安全点滴码农的世界

HTTP协议详解1--工作原理

2019-01-13  本文已影响1人  四月不见

一、简介

HTTP是个应用层协议。HTTP无需操心网络通信的具体细节;它把联网的细节都交给了通用、可选的因特网传输协议TCP/IP。只要建立了TCP连接,客户端和服务器端之间的报文交换就不会丢失、不会被破坏,也不会在接收时出现错序了。

用网络术语来说,HTTP协议位于TCP的上层。HTTP使用TCP来传输其报文数据。

在HTTP客户端向服务器发送报文之前,需要用网际协议(Internet Protocol,IP)地址和端口号在客户端和服务器之间建立一条TCP/IP连接。基本步骤如下图:

基本的浏览器处理

a)浏览器从URL中解析出服务器的主机名;
b)浏览器将服务器的主机名转换成服务器的IP地址;
c)浏览器将端口号(如果有的话)从URL中解析出来;
d)浏览器建立一条与web服务器的TCP连接;
e)浏览器向服务器发送一条HTTP请求报文;
f)服务器向浏览器回送一条HTTP响应报文;
g)关闭连接,浏览器显示文档。

二、TCP连接

在任意时刻计算机都可以有几条TCP连处于打开状态,TCP是通过端口号来保持所有这些连接持续不断地运行。

TCP连接是通过4个值来识别的:<源IP地址、源端口号、目的IP地址、目的端口号>,这4个值唯一定义了一条连接。

HTTP要传送一条报文时,会以流的形式将报文数据的内容通过一条打开的TCP连接按序传输。TCP收到数据流之后,会将数据流砍成被称作段的小数据块,并将段封闭在IP分组中,通过黑硬因特网传输,如:

当然,所有这些工作都是由TCP/IP软件来处理的,HTTP程序员什么都看不到。(下面小节将会介绍到TCP连接中著名的“三次握手”与“四次挥手”)

如上图,每个IP分组中都包括:

三、HTTP请求与响应的过程

当应用程序用TCP传送数据时,数据被送入协议栈中,然后逐个通过每一层直到被当作一串比特流送入网络。其中每一层对收到的数据都要增加一些首部信息(有时还要增加尾部信息)。

当目的主机收到一个以太网数据帧时,数据就开始从协议栈中由底向上升,同时去掉各层协议加上的报文首部。每层协议盒都要去检查报文首部中的协议标识,以确定接收数据的上层协议。这个过程称作分用(Demultiplexing)。

四、TCP的三次握手

TCP是面向连接的,无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。在TCP/IP协议中,TCP协议提供可靠的连接服务,连接是通过三次握手进行初始化的。三次握手的目的是同步连接双方的序列号和确认号并交换 TCP窗口大小信息。

TCP标示:
SYN(synchronous建立联机)
ACK(acknowledgement 确认)
Sequence number(顺序号码)

为什么要三次握手:

为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。

具体例子:“已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。”

下图是对TCP三次握手更加形象的一个解说:

五、TCP的四次挥手

当客户端和服务器通过三次握手建立了TCP连接以后,当数据传送完毕,肯定是要断开TCP连接的啊。那对于TCP的断开连接,这里就有了神秘的“四次分手”。

解说:

假设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连接就这样关闭了!

【注意】中断连接端可以是Client端,也可以是Server端。

六、一个完整的TCP连接

建立TCP需要三次握手才能建立,然后可以开始数据传输,而断开连接则需要四次挥手。

整个过程如下图所示:

参考

《HTTP权威指南》 David Gourley, Brian Totty, Marjorie Sayer, Sailu Reddy, Ansbu Aggarwal 著 陈涓 赵振平 译
简书博客:https://www.jianshu.com/p/c1d6a294d3c0

上一篇下一篇

猜你喜欢

热点阅读