认识一次完整的HTTP请求过程

前言:一次http请求所经历的几个步骤
1.建立TCP通信协议连接;
2.客户端向服务端发送请求指令;
3.客户端向服务端发送请求报文(数据);
4.服务端应答客户端的请求;
5.服务端发送应答报文(数据);
6.客户端关闭连接。
一、HTTP是什么?
http是计算机通过网络进行通信的规则,是一个基于请求与响应,无状态的,应用层的协议,常基于TCP/IP协议传输数据。
关键词:
请求与响应:客户端发送请求,服务端响应数据
无状态:协议对于事物处理没有记忆能力,客户端第一次与服务端建立连接发送请求时要进行一些列的安全认证匹配等,隐藏增加了页面等待时间。当客户端向服务端发送连接请求,服务端响应客户端完毕后,两者断开连接也不保持连接状态,一刀两断,相忘江湖,下次相遇形同路人。
应用层:http属于应用层协议,配合TCP/Ip使用。

在不同的业务场景下有时候需要保持之前的http通信状态,于是引入了 Cookie,还有HTTP/1.1想持久连接方法(HTTP keep-alive),在请求头部加入Connection: keep-alive即为表明使用了持久连接。

二、http报文格式?
HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成,如图格式。
1.请求行:
请求行分为三部分:请求方法,请求地址,协议版本
(1).请求方法:HTTP/1.1定义的请求方法有8种:GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、TRACE,最常见的是GET、POST,RestFull接口会用到GET、POST、DELETE、PUT.
(2).请求地址:Url统一资源定位符,是一种自愿位置的抽象唯一识别方法。组成结构:<协议>://<主机>:<端口>/<路径> ,端口和路径有时候可以省略,HTTP默认端口是80端口。
(3).协议版本:协议版本格式为:HTTP/主版本号.次版本号,常用的有HTTP/1.0,HTTP/1.1.

2.请求头部:
请求头部是为请求报文添加的一些附加信息,以键值对方式存在(key/value),请求头部的最后一行为空行,标识请求头部结束,下面为请求数据,这一行特别重要必不可少。
3.请求数据:
可选部分,比如GET请求就没有请求数据。
下面是一个POST方法的请求报文:
POST  /home/index HTTP/1.1    请求行
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2  请求头
Accept: text/html,application/xhtml+xml,application/xml;q=0.9, / ;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer:  http://localhost/
Content-Length:25
Content-Type:application/x-www-form-urlencoded
  空行
username=name&password=1111请求数据
三、HTTP响应报文?
http响应报文由状态行,响应头部,空行,响应数据组成。
1.状态行:由三部分组成:协议版本,状态码,状态码描述。其中协议版本与请求协议版本一直,状态码描述只是对状态码的一个简单的说明。
(1).状态码:由三位数组成
1xx:指示信息--表示请求已接收,继续处理。
2xx:成功--表示请求已被成功接收、理解、接受。
3xx:重定向--要完成请求必须进行更进一步的操作。
4xx:客户端错误--请求有语法错误或请求无法实现。
5xx:服务器端错误--服务器未能实现合法的请求
常见的状态码示例:
四、TCP三次握手建立连接
TCP是面向连接的,无论是那一个方发送数据都必须要首先在双方之间建立连接,在TCP/IP协议中TCP协议提供可靠得连接服务,连接是通过三次握手建立的。
三次握手的目的:同步连接双方的序列号和确认号,并交换TCP窗口大小信息

第一次握手:建立连接。客户端发送连接请求报文段,将SYN位置为1,Sequence Number为x;然后,客户端进入SYN_SEND状态,等待服务器的确认;
第二次握手:服务器收到SYN报文段。服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置Acknowledgment Number为x+1(Sequence Number+1);同时,自己自己还要发送SYN请求信息,将SYN位置为1,Sequence Number为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK报文段。然后将Acknowledgment Number设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。
五、TCP四次挥手(分手)
当客户端和服务端通过TCP三次握手建立连接并传送完数据后,要断开TCP连接,对与TCP断开连接需要进行四次难舍难分的挥手告别。

第一次分手:主机1(可以使客户端,也可以是服务器端),设置Sequence Number,向主机2发送一个FIN报文段;此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了;
第二次分手:主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment Number为Sequence Number加1;主机1进入FIN_WAIT_2状态;主机2告诉主机1,我“同意”你的关闭请求;
第三次分手:主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入LAST_ACK状态;
第四次分手:主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。
注意了:为什么要进行四次挥手告别?
TCP协议是一种面向连接,可靠的基于字节流动的运输层通信协议。TCP是全双工模式,主机1发送FIN报文时只表示主机1没有数据可发送了仅仅是告诉主机2,但还可以接收主机2发送的数据,当主机2返回ACK报文时,仅仅是主机2已知道主机1没有数据可发送了,但主机2还是能发送数据到主机1的,此时主机2也发送FIN报文,告知主机1自己也没数据发送了,之后就双方愉快的分手了。
六、一次HTTP请求与响应的过程


TCP/IP模型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值