HTTP详解总结

文章主要以一次HTTP请求的整个过程来讲解:HTTP起源、TCP/IP协议、建立TCP连接、客户端请求、服务端响应、断开TCP连接。
在这里插入图片描述

一、HTTP协议的演进

Http(HyperText Transfer Protocol)协议是基于TCP的应用层协议,它不关心数据传输的细节,主要用来规定客户端和服务端的数据传输格式,最初是用来向客户端传输HTML页面内容。默认端口是80

1.HTTP 0.9版本 1991年
这个版本最初用来向客户端传输HTML页面的,所以只有一个GET命令,服务器返回客户端一个HTML页面,不能是其它格式。利用这个版本完全可以构建一个简单的静态网站了。

2.HTTP 1.0版本 1996年
1.0版本改变是比较大的,奠定了现在HTTP协议的基础,这个版本的协议不仅可以传输HTML的文本页面,还可以传输其它二进制文件,例如图片、视频。而且还增加了现在常用的POST和HEAD命令,请求消息和响应消息也不是单一的,规定了一些元数据字段,例如:字符集、编码、状态码等

3.HTTP 1.1版本 1997年
实际上是在1.0版本之后半年时间又发布了一个版本,这个版本在1.0版本的基础上更加完善了。这个版本增加了持久连接,就是说之前版本的协议一次请求就是一次TCP连接,请求完成后这个连接就关闭掉了。众所周知TCP协议是可靠的,建立连接需要3次握手,断开连接需要4次挥手,并且TCP有流量控制和拥塞控制,有慢开始机制,刚建立连接时传输比较慢,这是比较耗费资源的。一个丰富的页面会有许多图片、表单和超链接。这样的话就会有多次的HTTP请求,所以在这个版本上默认不关闭TCP连接也不用声明Connection: keep-alive字段。如果确实要关闭可以指定Connection: close字段。还引入了管道机制,就是说在一个TCP连接里可以同时发送多个HTTP请求,而不必等待上一个请求响应成功再发送。还增加了PUT、PATCH、HEAD、 OPTIONS、DELETE等命令,丰富了客户端和服务端交互动作。还增加了Host字段。

4.HTTP 2版本 2015年
这个版本也是随着互联网的发展,有了新的需求制定了新的功能还有对上一个版本的完善。1.1版本有了管道机制,但是正在服务端还是要对请求进行排队处理。这个版本可以多工的处理。还有了头信息压缩和服务器的主动推送。

5.HTTPS
HTTPS是HTTP协议的安全版本,HTTP协议的数据传输是明文的,是不安全的,HTTPS使用了SSL/TLS协议进行了加密处理。

Http相关协议的区别请参考HTTP1.0、HTTP1.1 和 HTTP2.0 的区别

特点

HTTP 协议一共有五大特点:

  • 支持客户/服务器模式。
  • 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。
  • 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type(Content-Type是HTTP包中用来表示内容类型的标识)加以标记。
  • 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
  • 无状态:无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即我们给服务器发送 HTTP 请求之后,服务器根据请求,会给我们发送数据过来,但是,发送完,不会记录任何信息(Cookie和Session孕育而生,后期再讲)。
二、TCP/IP协议

我们经常听到一句话就是:HTTP是一个基于TCP/IP协议簇来传递数据。
如何理解上面那句话?我们来看看TCP/IP四层模型就明白了。
在这里插入图片描述
从上图我们可以清晰的看到HTTP使用的传输层协议为TCP协议,而网络层使用的是IP协议(当然还使用了很多其他协议),所以说HTTP是一个基于TCP/IP协议簇来传递数据。

同样我们可以看到ping走的ICMP协议,这也就是为什么有时候我们开vps可以上网,但是ping
google却ping不通的原因,因为走的是不同的协议。

那TCP/IP协议簇大致是如何工作的,我们再来看看下图:
在这里插入图片描述
我们可以看到在数据发送端是一层一层封装数据,数据接收端一层一层拆封,最后应用层获得数据。

三、建立TCP连接

我们知道了TCP/IP协议簇大致的工作原理之后,我们来看看HTTP是如何建立连接的。

1.TCP包头信息

前面咱们讲过HTTP是一个基于TCP/IP协议簇来传递数据,所以这HTTP建立连接也就是建立TCP连接,TCP如何建立连接,一起来看看TCP包信息结构吧。
在这里插入图片描述
TCP报文包=TCP头信息+TCP数据体,而在TCP头信息中包含了6种控制位(上图红色框中),这六种标志位就代表着TCP连接的状态:

  • URG:紧急数据(urgent data)—这是一条紧急信息
  • ACK:确认已收到
  • PSH:提示接收端应用程序应该立即从tcp接受缓冲区中读走数据
  • RST:表示要求对方重新建立连接
  • SYN:表示请求建立一个连接
  • FIN:表示通知对方本端要关闭连接了
2.建立连接过程

了解了TCP包头信息之后,我们就可以正式看看TCP建立连接的三次握手了。
在这里插入图片描述
三次握手讲解:

  • 客户端发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,服务器由SYN=1知道客户端要求建立联机(客户端:我要连接你)
  • 服务器收到请求后要确认联机信息,向A发送ack number=(客户端的seq+1),syn=1,ack=1,随机产生seq=7654321的包(服务器:好的,你来连吧)
  • 客户端收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,客户端会再发送ack
    number=(服务器的seq+1),ack=1,服务器收到后确认seq值与ack=1则连接建立成功。(客户端:好的,我来了)

面试官:为什么http建立连接需要三次握手,不是两次或四次
答:三次是最少的安全次数,两次不安全,四次浪费资源

四、HTTP请求头/响应头/首部字段

HTTP首部字段是构成HTTP报文最重要的元素之一。在客户端与服务端之前进行信息传递的时候请求和响应都会使用首部字段,会传递一些重要的信息。首部字段是以键值对的形式存在的。包含报文的主体大小、语言、认证信息等。HTTP首部字段包含4种类型:

  • 通用首部字段:代表请求头和响应头都会使用的字段
  • 请求首部字段:是客户端向服务器发送请求使用的首部字段
  • 响应首部字段:是服务端向客服端返回响应时使用的首部字段
  • 实体首部字段:是针对请求体和响应体的实体部分使用的部首

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

五、客户端请求

客户端与服务器连接上了之后,客户端就可以开始向服务器请求资源,就可以开始发送HTTP请求了。

1.HTTP请求报文结构

我们之前说过TCP报文包=TCP头信息+TCP数据体,TCP头信息我们已经讲了,现在来讲TCP数据体,也就是我们的HTTP请求报文
在这里插入图片描述

2.HTTP请求实例

来看看实际的HTTP请求例子:
在这里插入图片描述

  • 是请求方法,HTTP/1.1 定义的请求方法有8种:GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、TRACE,最常的两种GET和POST,如果是RESTful接口的话一般会用到GET、POST、DELETE、PUT
  • 为请求对应的URL地址,它和报文头的Host属性组成完整的请求URL
  • 是协议名称及版本号
  • 是HTTP的报文头,报文头包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端的信息
  • 是报文体,它将一个页面表单中的组件值通过param1=value1&param2=value2的键值对形式编码成一个格式化串,它承载多个请求参数的数据。不但报文体可以传递请求参数,请求URL也可以通过类似于“/chapter15/user.html?
    param1=value1&param2=value2”的方式传递请求参数。
六、服务端响应

服务器在收到客户端请求处理完需要响应并返回给客户端,而HTTP响应报文结构与请求结构体一致。

1.HTTP响应报文结构

在这里插入图片描述

2.HTTP响应实例

在这里插入图片描述

3.响应状态码

响应报文中我们重点关注下:服务器的响应状态码,面试也很容易问到,下面猪哥只列出分类,详细状态码自行上网查找了解。
在这里插入图片描述

七、断开连接

在服务器响应完毕后,一次会话就结束了,请问这时候连接会断开吗?

1.长短连接

是否断开我们需要区分HTTP版本:

  • 在HTTP/1.0版本的时候,客户端与服务器完成一个请求/响应之后,会将之前建立的TCP连接断开,下次请求的时候又要重新建立TCP连接,这也被称为短连接
  • 在HTTP1.0发布仅半年后(1997年1月) ,HTTP/1.1版本发布并带来一个新的功能:在客户端与服务器完成一次请求/响应之后,允许不断开TCP连接,这意味着下次请求就直接使用这个TCP连接而不再需要重新握手建立新连接,这也被称为长连接

注意:长连接是指一次TCP连接允许多次HTTP会话,HTTP永远都是一次请求/响应,会话结束,HTTP本身不存在长连接之说。

早在1999年HTTP1.1就推广普及,所以现在浏览器在请求时请求头中都会携带一个参数:Connection:keep-alive,这表示浏览器要求与服务器建立长连接,而服务器也可以设置是否愿意建立长连接。

2.长连接优缺点

对于服务器来说建立长连接有优点也有缺点:

  • 优点:当网站中有大量静态资源(图片、css、js等)就可以开启长连接,这也几张图片就可以通过一次TCP连接发送。
  • 缺点:当客户端请求一次时候不在请求,而服务器却开着长连接资源被占用着,这是严重浪费资源。 所以是否开启长连接,长连接时间都需要根据网站自身来合理设置。

注意:大家不要小看这一个TCP连接,在一次客户端HTTP完整的请求中(DNS寻址、建立TCP连接、请求、等待、解析网页、断开TCP连接)建立TCP连接占用的时间比还是很大的。

3.断开连接过程

在建立TCP连接时是三次握手,而断开TCP连接是四次挥手!
在这里插入图片描述
TCP关闭连接过程:

  • Client向Server发送FIN包,表示Client主动要关闭连接,然后进入FIN_WAIT_1状态,等待Server返回ACK包。此后Client不能再向Server发送数据,但能读取数据。

  • Server收到FIN包后向Client发送ACK包,然后进入CLOSE_WAIT状态,此后Server不能再读取数据,但可以继续向Client发送数据。

  • Client收到Server返回的ACK包后进入FIN_WAIT_2状态,等待Server发送FIN包。

  • Server完成数据的发送后,将FIN包发送给Client,然后进入LAST_ACK状态,等待Client返回ACK包,此后Server既不能读取数据,也不能发送数据。

  • Client收到FIN包后向Server发送ACK包,然后进入TIME_WAIT状态,接着等待足够长的时间(2MSL)以确保Server接收到ACK包,最后回到CLOSED状态,释放网络资源。

  • Server收到Client返回的ACK包后便回到CLOSED状态,释放网络资源。

在前面讲TCP/IP协议时我们说过标志位:FIN表示通知对方本端要关闭连接了,
那断开连接为何需要四次挥手呢?

TCP是全双工信道,何为全双工就是客户端与服务端建立两条通道,

  • 通道1:客户端的输出连接服务端的输入;
  • 通道2:客户端的输入连接服务端的输出。
  • 两个通道可以同时工作:客户端向服务端发送信号的同时服务端也可以向客户端发送信号。所以关闭双通道的时候就是这样: 客户端:我要关闭输入通道了。 服务端:好的,你关闭吧,我这边也关闭这个通道。 服务端:我也要关闭输入通道了。 客户端:好的你关闭吧,我也把这个通道关闭。
八、关于HTTP常见问题以及解答
1.GET和POST的区别
  • GET用于获取资源信息,而POST用于更新资源信息
  • GET提交请求的数据实体会放在URL后面,用?来分割,例如://higo.gome.com.cn?name=lucy&age=18
  • GET提交的数据长度是有限制,而POST没有
  • GET提交的数据不安全,因为参数都会暴露在URL上面
2.408 Request Timeout和504 Gateway Timeout区别

408是请求超时,504是响应超时;408一般是客户端或者网络拥塞,504是服务端响应过慢,也有可能是网络问题

3.Cookie和Session区别

Cookie和Session都是为了保存客户端和服务端的交互状态。Cookie是保存在客户端,Session是保存在服务端;Cookie是客户端请求服务端时服务器会将一些信息以键值对形式返回给客户端,保存在浏览器中。Cookie的缺点是大小和数量都有限制(浏览器标准不一致,建议cookie个数小于20个,总大小小于4KB);Cookie如果很大,每次请求都要带上,这样就影响了传输效率。Session是基于Cookie来实现的,Session存在于服务端,但是每次传输的时候不会传输数据,只是把代表一个客户端的唯一ID(SessionID)写在客户端。Session优势传输数据量小,比较安全。

参考链接:https://blog.csdn.net/u014044812/article/details/91423184

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值