参考:
https://www.jianshu.com/p/8a40f99da882
https://blog.csdn.net/a15028596338/article/details/79265952
《图解HTTP》
背景:
平常http请求用的很多,像浏览器,手机接口等,但是真的要描述却说不出个所以然,只是隐约的记得TCP的三次握手和四次挥手,这里重新对整个请求进行学习和整理。
一、什么是HTTP
- 概述
HTTP全称是HyperText Transfer Protocal,即超文本传输协议,从1990年开始就在WWW上广泛应用,是现今在WWW上应用最多的协议,HTTP是应用层协议,当你上网浏览网页的时候,浏览器和web服务器之间就会通过HTTP在Internet上进行数据的发送和接收。HTTP是一个基于请求/响应模式的、无状态的协议。即我们通常所说的Request/Response。
- 特点
支持客户端/服务器模式
简单快速:客户向服务器请求服务时,只需传送请求方法和路径。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快
灵活:HTTP允许传输任意类型的数据对象,正在传输的类型由Content-Type加以标记
无连接:无连接的含义是限制每次链接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开链接,采用这种方式可以节省时间
无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能会导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就比较快。
二、HTTP协议
1. HTTP请求格式
http URL:一种特殊类型的URL,包含了用于查找某个资源的足够的信息,格式如下:
http://host[":"port][abs_path]
http:表示要通过HTTP协议来定位网络资源,
host:表示合法的Internet主机域名或者IP地址
port:指定一个端口号,为空则使用缺省端口80
abs_path:指定请求资源的URI,如果URL中没有给出abs_path,那么当它作为请求URI时,必须以“/”的形式给出,通常这个浏览器自动帮我们完成了。
2. DNS(域名系统)
- 概念
互联网上作为域名和IP地址相互映射的一个分布式数据库。域名系统就是存储IP地址和域名映射的一个数据库。而DNS解析,就是通过这个数据库去查找到可以使两台联网设备进行通信的IP地址的一个过程。
- 作用
这里首先了解一下计算机之间是怎样进行通信的。
有两台电脑A和B,A电脑想向B电脑发送一条信息,那该怎么办呢?
其实很简单,就像邮递员(假设为电脑A)要给某栋大楼内的某个房间的客户(假设为电脑B)送邮件一样,邮递员要想把邮件送到客户手上,那他必须知道客户的大楼名称(或者说地址)以及客户在这栋大楼内的房间号。
在互联网的世界中也是一样,电脑A想向电脑B发送一条信息,电脑A就得知道电脑B的MAC地址和IP地址。MAC地址就相当于电脑的网卡,每一个都是独一无二的。IP地址这个东西是由32位二进制组成的网络地址(IPv4),即使习惯上把它表示为四段十进制的形式(如202.201.112.232),也是不好记忆的,所以就发明了域名来代替IP地址,其实就是给IP地址起了一个别名,方便记忆。
这里需要注意的是:任何一个域名都对应一个或者多个ip地址,但是大部分都是一个域名对应一个ip地址。
3. 端口
端口是用来区别不同程序之间的通信。比如你一边在浏览网页,一边与朋友在线聊天,当一个数据从互联网发来时就需要端口进行区分这个数据是属于哪个程序的。
端口是0到65535之间的一个整数,正好16个二进制位。0到1023的端口被系统占用,用户只能选用大于1023的端口。不管是浏览网页还是在线聊天,应用程序会随机选用一个端口,然后与服务器的相应端口联系。
4. UDP和TCP
当两台联网设备通过IP地址和MAC地址完成了“链接”之后,接下来就是通信了,而通信就需要传输数据(哪怕只是一个没有数据的请求)。要想传输数据,就需要建立一个传输数据的链接。UDP和TCP都是传输层的协议,不同点就是传输的方式不同。
- UDP
UDP协议简单来说就是在数据包中插入一段数据用来标记端口信息,然后将数据发送出去,至于发送出去的数据包有没有被目标设备接收到,它就不管了。以这种方式发送数据包的有点就是简单,容易实现,但是缺点就是可靠性差,因为通过UDP协议发送出去的数据包无法确定发送的数据包是否到达目标设备。
- TCP
而TCP协议就是为了解决UDP协议的缺点而诞生的,它虽然实现上比UDP协议复杂,但是可靠性好,可以保证数据被发送到目标设备上。
- TCP三次握手
TCP协议是如何保证可靠性的呢?就是通过三次与目标设备的通信来确定数据包发送成功。以浏览器和服务器的通信来打比方:
浏览器:你好服务器,我是 浏览器A。
服务器:你好 浏览器A,我是 服务器B。
浏览器:服务器B 你好。
官方描述:

过程描述:
1)第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
2)第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
3)第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
完成三次握手,客户端与服务器开始传送数据。这样就保证了,每次传送数据都会准确到达目标设备了。
2. TCP四次挥手
当数据包发送完毕需要断开连接的时候,就需要TCP的四次挥手来保证链接的合理断开。再次以浏览器和服务器的通信打比方:
主动结束方:你好,我的数据发送完毕了,我要进入准备断开的状态了。(此时它虽然不再发送数据了,但是可以接受数据)
另一方:我知道了,我还没有发送完毕的,你等着吧。
另一方:我也发送完毕了,可以断开链接了。(此时它也进入准备断开的状态)
主动结束方:好的,那断开吧。
官方描述:

过程描述:
1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。
2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A。
4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。
之所以关闭连接比建立连接多了一次是因为
服务端的listen状态下的socket当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。
5. 报文
用于 HTTP 协议交互的信息被称为 HTTP 报文。请求端(客户端)的 HTTP 报文叫做请求报文,响应端(服务器端)的叫做响应报文。 HTTP 报文本身是由多行(用 CR+LF 作换行符)数据构成的字符串文本。
- HTTP请求报文

1)常见请求头信息:
Accept: */* #可接受的媒体类型
Accept-Encoding: gzip, deflate #可接受的编码
Accept-Language: zh-cn #接受的语言
Connection: Keep-Alive #持久连接
Host: cache.soso.com #Host
Referer: http://help.soso.com/ #引用页面
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; InfoPath.2) #用户代理
2)http请求方法
GET请求:获取Request-URI资源,浏览网页、下载应用、观看视频等
POST请求:使用Request-URI资源处理提交的数据,提交登陆信息、上传文件等
HEAD请求:获取由Request-URI资源的响应消息头,获取文件大小、做可用性探测等
PUT请求:把提交的数据存放在Request-URI资源处
DELETE请求:请求服务器删除Request-URI资源
TRACE:请求服务器回送收到的请求消息
OPTION:获取服务器对Request-URI资源所支持的方法
- HTTP响应报文

1)常见的响应头信息:
Accept-Ranges: bytes #表示服务器端可以接受range请求
Cache-Control: max-age=86400 #缓存控制时间
Content-Encoding: gzip #内容编码格式
Content-Length: 1088 #内容长度
Content-Type: text/javascript #内容类型
Date: Thu, 18 Jun 2009 15:47:14 GMT #时间
ETag: “1902284250“ #实体标签
Expires: Fri, 19 Jun 2009 15:47:14 GMT #过期时间
Last-Modified: Fri, 10 Oct 2008 04:13:19 GMT #最后修改时间
Server: WS CDN Server #server名称
Vary: Accept-Encoding #告知该响应缓存时取决的方式
2)响应状态码:
2xx:表示成功处理了请求的状态码:
200:请求已成功,请求所希望的响应头或数据体将随此响应返回
206:服务器已经成功处理了部分GET请求
3xx:要完成请求,需进一步操作。通常,这些状态码用来重定向。
302:请求的资源临时从不同的 URI响应请求
304:文件未更新
4xx:这类状态码表示请求可能出错,妨碍了服务器的处理。
404:请求所希望得到的资源未被在服务器上发现
403:服务器已经理解请求,但是拒绝执行
5xx:表示服务器在处理请求时发生内部错误。这些错误可能是服务器本身的错误,而不是请求出错。
502:执行请求时,从上游服务器接收到无效的响应
503:由于临时的服务器维护或者过载,服务器当前无法处理请求
504:执行请求时,未能及时从上游服务器或者辅助服务器(例如DNS)收到响应
三、总结
在浏览器地址框输入了域名并回车,然后通过DNS解析找到相应的IP地址;然后通过HTTP协议建立了链接,找到了目标服务器的位置;接着就是TCP三次握手建立可靠链接,发送数据,服务器处理数据,TCP四次挥手断开链接;最后浏览器根据返回的数据解析渲染呈现页面。
本文深入解析HTTP协议,涵盖其历史背景、工作原理、请求与响应格式、DNS解析、端口、TCP三次握手及四次挥手等内容,助您全面理解HTTP。
695

被折叠的 条评论
为什么被折叠?



