HTTP请求总结分享

1.HTTP请求简介

1.1 什么是HTTP请求

通俗来讲,他就是计算机通过网络进行通信的规则,是一个基于请求与响应,无状态的,应用层的协议,常基于TCP/IP协议传输数据。目前任何终端(手机,笔记本电脑。。)之间进行任何一种通信都必须按照Http协议进行,否则无法连接。
其实,关键字就是三个:tcp/ip、一种网络应用层协议、超文本传输协议。

1.2 HTTP请求的特点

  • 支持客户/服务器模式
  • 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
  • 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type(Content-Type是HTTP包中用来表示内容类型的标识)加以标记
  • 无连接:限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接
  • 无状态:协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态

1.3 HTTP的请求方式

HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。

HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。

HTTP2.0 新的二进制格式(Binary Format),HTTP1.x的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认0和1的组合。基于这种考虑HTTP2.0的协议解析决定采用二进制格式,实现方便且健壮。
在这里插入图片描述

  • GET:最常见的一种请求方式,当客户端要从服务器中读取文档时,当点击网页上的链接或者通过在浏览器的地址栏输入网址来浏览网页的,使用的都是GET方式。GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号(“?”)代表URL的结尾与请求参数的开始,传递参数长度受限制;
  • POST:POST方法可以允许客户端给服务器提供信息较多。POST方法将请求参数封装在HTTP请求数据中,以名称/值的形式出现,可以传输大量数据,这样POST方式对传送的数据大小没有限制,而且也不会显示在URL中;

1.4 HTTP请求报文和响应报文

1.4.1 HTTP请求报文

一个HTTP请求报文由请求行(request line)、请求头(header)、空行和请求数据4个部分组成,请求报文的一般格式如下:
在这里插入图片描述
1)GET请求报文示例

//请求首行

GET /hello/index.jsp HTTP/1.1

//请求头信息,因为GET请求没有正文

Host: localhost

User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0

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

Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7

Connection: keep-alive

Cookie: JSESSIONID=369766FDF6220F7803433C0B2DE36D98

//空行

//因为GET没有正文,所以下面为空

2)POST请求报文示例

// 请求首行

POST /hello/index.jsp HTTP/1.1

//请求头信息

Host: localhost

User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0

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

Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7

Connection: keep-alive

Referer: http://localhost/hello/index.jsp

Cookie: JSESSIONID=369766FDF6220F7803433C0B2DE36D98

Content-Type: application/x-www-form-urlencoded 

Content-Length: 14 

// 这里是空行

//POST有请求正文

username=hello
1.4.2 HTTP响应报文

HTTP响应也由三个部分组成,分别是:状态行、响应头、空行、响应正文。
在这里插入图片描述
正如你所见,在响应中唯一真正的区别在于第一行中用状态信息代替了请求信息。状态行(status line)通过提供一个状态码来说明所请求的资源情况。

2.GET请求和POST请求的区别

这是一个老生长谈的面试题,每个人都有自己的理解,角度不同,总结归纳的也不尽相同,以下也仅代表我的观点,欢迎指正和讨论

  • 用处:最常听到的一句话是:get常用于取回数据,post用于提交数据。大体上大家都是这样去开发的,但是,在某些特定场景下或者框架下,post也是可以用于取回数据的,这个需要我们因地制宜;
  • 请求参数长度限制:get请求长度最多1024kb,post对请求数据没有限制。这个大家都知道,但是究其原因,可能大家不是很清楚,甚至有的人会认为这是get请求做的限定,其实,这种想法是不对的。GET方法提交的url参数数据大小没有限制,在http协议中没有对url长度进行限制(不仅仅是querystring的长度),这个限制是特定的浏览器及服务器对他的限制,比如IE浏览器对URL的最大限制为2083个字符,Firefox为65,536个字符;
  • post比get安全性要高:post比get安全性要高,因为通过get提交的数据都将显示到url上,页面会被浏览器缓存,其他人查看历史记录会看到提交的数据,而post不会,同时,get提交数据还可能会造成CSRF攻击。

3.HTTPS和HTTP区别

3.1 什么是HTTPS

HTTPS 实际上是带有 SSL 的 HTTP(HTTP + SSL=HTTPS)。HTTPS 经过 SSL 的加密校验、身份确认之后会建立独立的安全数据传输通道。HTTPS 的安全性往往体现在三个方面:服务器身份验证,通过服务器身份验证,用户可以明确当前它正在与对应的服务器进行通信。数据机密性,其他方无法理解发送的数据内容,因为提交的数据是加密的。数据完整性,传输会携带 Message Authentication Code(MAC)用于验证,因此传输的数据不会被另一方更改。

3.2 HTTPS和HTTP差别

核心区别是https请求,建立tcp连接后先要通过tls协议协商好双方加密的信息,然后才可以进行数据的发送和接收。发送前,先把数据加密,接收后,先把数据解密。http的话,建立tcp连接后,就直接按照http协议发送字符串明文了。
在这里插入图片描述
在这里插入图片描述

4.三次握手和四次挥手

4.1 TCP报文字段解析

在这里插入图片描述

  • 序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号seq就是这个报文段中的第一个字节的数据编号。
  • 确认号ack:占4个字节,期待收到对方下一个报文段的第一个数据字节的序号;序列号表示报文段携带数据的第一个字节的编号;而确认号指的是期望接收到下一个字节的编号;因此当前报文段最后一个字节的编号+1即为确认号。
  • 确认ACK:占1位,仅当ACK=1时,确认号字段才有效。ACK=0时,确认号无效
  • 同步SYN:连接建立时用于同步序号。当SYN=1,ACK=0时表示:这是一个连接请求报文段。若同意连接,则在响应报文段中使得SYN=1,ACK=1。因此,SYN=1表示这是一个连接请求,或连接接受报文。SYN这个标志位只有在TCP建产连接时才会被置1,握手完成后SYN标志位被置0。
  • 终止FIN:用来释放一个连接。FIN=1表示:此报文段的发送方的数据已经发送完毕,并要求释放运输连接
  • 补充:ACK、SYN和FIN这些大写的单词表示标志位,其值要么是1,要么是0;ack、seq小写的单词表示序号。

4.2 三次握手

4.2.1 三次握手模拟图

建立连接时三次握手:
在这里插入图片描述

4.2.2 三次握手流程
  • 第一次握手:建立连接。客户端发送连接请求报文段,将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三次握手。
4.2.3 为什么是三次

3次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。
如果把三次握手改成仅需要两次握手,第二次握手,服务端向客户端发送报文之后,服务端是不知道客户端是否收到服务返回的信息的,这样没有给服务器端一个创建还是关闭连接端口的请求,服务器端的端口就一直开着,长此以往,这样的端口多了,就会造成服务器端开销的严重浪费。

4.2.4 建立连接后故障处理机制

TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

4.3 四次挥手

4.3.1 四次挥手模拟图

断开连接时四次握手:
在这里插入图片描述

4.2.2 四次挥手流程
  • 第一次:客户端 A 发送一个 FIN ,用来关闭客户 A 到服务器 B 的数据传送(报文段 4 );
  • 第二次:服务器 B 收到这个 FIN ,它发回一个 ACK ,确认序号为收到的序号加 1 (报文段 5 )。和 SYN 一样,一个FIN 将占用一个序号。
  • 第三次:服务器 B 关闭与客户端 A 的连接,发送一个 FIN 给客户端 A (报文段 6 );
  • 第四次:客户端 A 发回 ACK 报文确认,并将确认序号设置为收到序号加 1 (报文段 7 )。
4.3.3 断开连接为什么要四次挥手

关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

4.3.4 最大报文段生存时间2MSL用途

虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。在Client发送出最后的ACK回复,但该ACK可能丢失。Server如果没有收到ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。

5.HTTP常见状态码

在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值