上一篇推荐:爬虫系列 ——学前准备
前言
本文以一次HTTP请求的整个过程来带你深入了解http(注意:这里我们不讲DNS解析,也没必要,有兴趣的可以去自己了解一下)
一、http简介
1.简介
HTTP(HyperText Transfer Protocol)即超文本传输协议,是一种详细规定了浏览器和万维网服务器之间互相通信的规则,它是万维网交换信息的基础,它允许将HTML(超文本标记语言)文档从Web服务器传送到Web浏览器。
HTTP协议目前最新版是1.1,HTTP是一种无状态的协议,无状态是指Web浏览器与Web服务器之间不需要建立持久的连接,这意味着当一个客户端向服务器端发出请求,然后Web服务器返回响应(Response),连接就被关闭了,在服务器端不保留连接的有关信息。也就是说,HTTP请求只能由客户端发起,而服务器不能主动向客户端发送数据。
HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。
2.五大特点
支持客户/服务器模式。
简单快速:客户向服务器请求服务时,只需传送请求方法和路径。
灵活:HTTP允许传输任意类型的数据对象;正在传输的类型由Content-Type(Content-Type是HTTP包中表示内容类型的标识)加以标记。
无连接:无连接是指限制每次连接只处理一个请求;服务器处理完客户的请求,并收到客户的应答后,即断开连接;采用这种方式可以节省传输时间。
无状态:无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。
二、TCP / IP协议
1.TCP/IP四层模型
可以看出HTTP使用的传输层协议是TCP / UDP协议,网络层使用的是IP协议(当然了还使用其他协议),所以说HTTP是一个基于TCP/IP协议簇来传递数据。
2.TCP/IP协议簇工作原理图
可以看出在数据发送端是一层一层的来封装数据,而在数据接收端是一层一层来拆封,最后应用层获得数据。
三、建立TCP链接
1.TCP包头信息
TCP包信息结构图
TCP报文包=TCP头信息+TCP数据体
TCP头信息中的6种控制位(红色框中)介绍:
URG:紧急数据(urgent data)—-这是一条紧急信息
ACK:确认已收到
PSH:提示接收端应用程序应该立即从tcp接收缓冲区中读走数据
RST:表示要求对方重新建立连接
SYN:表请求建立一个连接
FIN:表示通知对方本端要关闭连接了
2.如何建立连接
三次握手详解:
第一次握手:客户端给服务端发一个 SYN 报文,并指明客户端的初始化序列号 ISN©。此时客户端处于 SYN_SEND 状态。首部的同步位SYN=1,初始序号seq=x,SYN=1的报文段不能携带数据,但要消耗掉一个序号。
第二次握手:服务器收到客户端的 SYN 报文之后,会以自己的 SYN 报文作为应答,并且也是指定了自己的初始化序列号 ISN(s)。同时会把客户端的 ISN + 1 作为ACK 的值,表示自己已经收到了客户端的 SYN,此时服务器处于 SYN_REVD 的状态。在确认报文段中SYN=1,ACK=1,确认号ack=x+1,初始序号seq=y。
第三次握手:客户端收到 SYN 报文之后,会发送一个 ACK 报文,当然,也是一样把服务器的 ISN + 1 作为 ACK 的值,表示已经收到了服务端的 SYN 报文,此时客户端处于 ESTABLISHED 状态。服务器收到 ACK 报文之后,也处于 ESTABLISHED 状态,此时,双方已建立起了连接。确认报文段ACK=1,确认号ack=y+1,序号seq=x+1(初始为seq=x,第二个报文段所以要+1),ACK报文段可以携带数据,不携带数据则不消耗序号。
四、客户端请求
客户端和服务器勾搭上之后就可以向服务器发送http请求了
HTTP请求报文
一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成。
请求行:请求行分为三个部分:请求方法、请求地址和协议版本。
请求方法:常见请求方法有两种GET和POST。
请求地址:URL:统一资源定位符,是一种自愿位置的抽象唯一识别方法。组成:<协议>://<主机>:<端口>/<路径>,端口和路径有时可以省略(HTTP默认端口号是80),有时会带参数,GET请求
协议版本:协议版本的格式为:HTTP/主版本号.次版本号,常用的有HTTP/1.0和HTTP/1.1
请求头部:请求头部为请求报文添加了一些附加信息,由“名+/+值”组成,每行一对,名和值之间使用冒号分隔开。请求头部的最后会有一个空行,表示请求头部结束,接下来为请求数据,这一行必不可少。
常见请求头如下:
请求数据
这是个可选部分,比如GET请求就没有请求数据。这里给大家给出一个POST方法的请求报文:
五、服务端响应
服务器在收到客户端的请求之后,需要响应并返回给客户端。HTTP响应报文主要由状态行、响应头部、空行以及响应数据组成。
HTTP响应报文
状态行
由3部分组成,分别为:协议版本,状态码,状态码描述。其中协议版本与请求报文一致,状态码描述是对状态码的简单描述。
状态代码为3位数字:
1xx:指示信息–表示请求已接收,继续处理。
2xx:成功–表示请求已被成功接收、理解、接受。
3xx:重定向–要完成请求必须进行更进一步的操作。
4xx:客户端错误–请求有语法错误或请求无法实现。
5xx:服务器端错误–服务器未能实现合法的请求。
响应头部
响应头部和请求头部相似,常见响应头部如下:
响应数据
主要用来存放返回给客户端的数据信息,这里给大家给出一个响应报文实例:
六、断开连接
在客户端和服务器通过三次握手建立了TCP链接之后,客户端发起请求,服务器响应请求,数传输完毕之后,一次完整的会话就结束了,这时候一定要断开TCP链接吗?
长短连接
是否断开连接在于HTTP的版本
HTTP/1.0版本,客户端与服务器完成一次数请求和响应后,就会断开TCP连接,称为短连接
HTTP/1.1版本,客户端与服务器完成一次请求/响应后,可以不断开TCP连接,也就是说下次请求可以直接使用这个TCP连接而不需要重新握手建立新的连接,称为长连接
长连接优缺点
优点:如果网站中有大量的静态资源(图片、css、js等)就可以开启长连接,这样连续的几张图片就可以通过一次TCP连接全部发送。
缺点:如果客户端只请求一次,之后不再进行请求,而服务器开启的是长连接,资源就会被占用、浪费。
四次挥手
四次挥手详解
第一次分手:主动方(可以是客户端,也可以是服务器端),设置Sequence Number,向被动方发送一个FIN报文段,此时,主动方进入FIN_WAIT_1状态;这表示主动方没有数据要发送给被动方了;
第二次分手:被动方收到了主动方发送的FIN报文段,向主动方回一个ACK报文段,Acknowledgment Number为Sequence Number加1;主动方进入FIN_WAIT_2状态;被动方告诉主动方,我“同意”你的关闭请求;
第三次分手:被动方向主动方发送FIN报文段,请求关闭连接,同时被动方进入LAST_ACK状态;
第四次分手:主动方收到被动方发送的FIN报文段,向被动方发送ACK报文段,然后主动方进入TIME_WAIT状态;被动方收到主动方的ACK报文段以后,就关闭连接;此时,主动方等待2MSL后没有收到回复,则证明Server端已正常关闭,主动方也可以关闭连接了
为什么要进行四次握手
TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工模式,这就意味着,当主机A发出FIN报文段时,只是表示主机A没有数据要发送了,主机A告诉主机B它的数据已经全部发送完毕;但是,主机A还是可以接受来自主机B的数据;当主机B返回ACK报文段时,表示它已经知道主机A没有数据发送了,但是主机B还是可以发送数据到主机A的;当主机B也发送了FIN报文段时,就表示主机B也没有数据要发送了,就会告诉主机A,它也没有数据要发送了,此时就可以愉快的中断这次TCP连接。
还是那一句:
希望大家可以去发现我的错误、提出自己想法,互相帮助,共同进步