⼀次完整的HTTP请求响应过程(很详细)
⼀、 HTTP请求和响应步骤
图⽚来⾃:
以上完整表⽰了HTTP请求和响应的7个步骤,下⾯从TCP/IP协议模型的⾓度来理解HTTP请求和响应如何传递的。
⼆、TCP/IP协议
TCP/IP协议模型(Transmission Control Protocol/Internet Protocol),包含了⼀系列构成互联⽹基础的⽹络协议,是Internet的核⼼协议,通过20多年的发展已⽇渐成熟,并被⼴泛应⽤于局域⽹和⼴域⽹中,⽬前已成为事实上的国际标准。TCP/IP协议簇是⼀组不同层次上的多个协议的组合,通常被认为是⼀个四层协议系统,与OSI的七层模型相对应。
HTTP协议就是基于TCP/IP协议模型来传输信息的。
(1). 链路层
也称作数据链路层或⽹络接⼝层(在第⼀个图中为⽹络接⼝层和硬件层),通常包括操作系统中的设备驱动程序和计算机中对应的⽹络接⼝卡。它们⼀起处理与电缆(或其他任何传输媒介)的物理接⼝细节。ARP(地址解析协议)和RARP(逆地址解析协议)是某些⽹络接⼝(如以太⽹和令牌环⽹)使⽤的特殊协议,⽤来转换IP层和⽹络接⼝层使⽤的地址。
(2). ⽹络层
也称作互联⽹层(在第⼀个图中为⽹际层),处理分组在⽹络中的活动,例如分组的选路。在TCP/IP协议族中,⽹络层协议包括IP协议(⽹际协议),ICMP协议(Internet互联⽹控制报⽂协议),以及IGMP协议(Internet组管理协议)。
IP是⼀种⽹络层协议,提供的是⼀种不可靠的服务,它只是尽可能快地把分组从源结点送到⽬的结点,但是并不提供任何可靠性保证。同时被TCP和UDP使⽤。TCP和UDP的每组数据都通过端系统和每个中间路由器中的IP层在互联⽹中进⾏传输。
ICMP是IP协议的附属协议。IP层⽤它来与其他主机或路由器交换错误报⽂和其他重要信息。
IGMP是Internet组管理协议。它⽤来把⼀个UDP数据报多播到多个主机。
(3). 传输层
主要为两台主机上的应⽤程序提供端到端的通信。在TCP/IP协议族中,有两个互不相同的传输协议:TCP(传输控制协议)和UDP(⽤户数据报协议)。
TCP为两台主机提供⾼可靠性的数据通信。它所做的⼯作包括把应⽤程序交给它的数据分成合适的⼩块交给下⾯的⽹络层,确认接收到的分组,设置发送最后确认分组的超时时钟等。由于运输层提供了⾼可靠性的端到端的通信,因此应⽤层可以忽略所有这些细节。为了提供可靠的服务,TCP采⽤了超时重传、发送和接收端到端的确认分组等机制。
UDP则为应⽤层提供⼀种⾮常简单的服务。它只是把称作数据报的分组从⼀台主机发送到另⼀台主机,但并不保证该数据报能到达另⼀端。⼀个数据报是指从发送⽅传输到接收⽅的⼀个信息单元(例如,发送⽅指定的⼀定字节数的信息)。UDP协议任何必需的可靠性必须由应⽤层来提供。
(4). 应⽤层
应⽤层决定了向⽤户提供应⽤服务时通信的活动。TCP/IP 协议族内预存了各类通⽤的应⽤服务。包括 HTTP,FTP(File Transfer Protocol,⽂件传输协议),DNS(Domain Name System,域名系统)服务。
当应⽤程序⽤TCP传送数据时,数据被送⼊协议栈中,然后逐个通过每⼀层直到被当作⼀串⽐特流送⼊⽹络。其中每⼀层对收到的数据都要增加⼀些⾸部信息(有时还要增加尾部信息),该过程如图所⽰。
当⽬的主机收到⼀个以太⽹数据帧时,数据就开始从协议栈中由底向上升,同时去掉各层协议加上的报⽂⾸部。每层协议盒都要去检查报⽂⾸部中的协议标识,以确定接收数据的上层协议。这个过程称作分⽤(Demultiplexing)。协议是通过⽬的端⼝号、源I P地址和源端⼝号进⾏解包的。
通过以上步骤我们从TCP/IP模型的⾓度来理解了⼀次HTTP请求与响应的过程。
下⾯这张图更清楚明⽩:
下⾯具体来看如何进⾏⼀步步操作的。
三、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三次握⼿。
为什么要三次握⼿
为了防⽌已失效的连接请求报⽂段突然⼜传送到了服务端,因⽽产⽣错误。
具体例⼦:“已失效的连接请求报⽂段”的产⽣在这样⼀种情况下:client发出的第⼀个连接请求报⽂段并没有丢失,⽽是在某个⽹络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是⼀个早已失效的报⽂段。但server收到此失效的连接请求报⽂段后,就误认为是client再次发出的⼀个新的连接请求。于是就向client发出确认报⽂段,同意建⽴连接。假设不采⽤“三次握⼿”,那么只要server发出确认,新的连接就建⽴了。由于现在client并没有发出建⽴连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建⽴,并⼀直等待client发来数据。这样,server的很多资源就⽩⽩浪费掉了。采⽤“三次握⼿”的办法可以防⽌上述现象发⽣。例如
刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建⽴连接。”
四、HTTP协议
Http是什么?
通俗来讲,他就是计算机通过⽹络进⾏通信的规则,是⼀个基于请求与响应,⽆状态的,应⽤层的协议,常基于TCP/IP协议传输数据。⽬前任何终端(⼿机,笔记本电脑。。)之间进⾏任何⼀种通信都必须按照Http协议进⾏,否则⽆法连接。
四个基于:
请求与响应:客户端发送请求,服务器端响应数据
⽆状态的:协议对于事务处理没有记忆能⼒,客户端第⼀次与服务器建⽴连接发送请求时需要进⾏⼀系列的安全认证匹配等,因此增加页⾯等待时间,当客户端向服务器端发送请求,服务器端响应完毕后,两者断开连接,也不保存连接状态,⼀⼑两断!恩断义绝!从此路⼈!下⼀次客户端向同样的服务器发送请求时,由于他们之前已经遗忘了彼此,所以需要重新建⽴连接。
应⽤层:Http是属于应⽤层的协议,配合TCP/IP使⽤。
TCP/IP:Http使⽤TCP作为它的⽀撑运输协议。HTTP客户机发起⼀个与服务器的TCP连接,⼀旦连接建⽴,浏览器(客户机)和服务器进程就可以通过套接字接⼝访问TCP。
针对⽆状态的⼀些解决策略:
有时需要对⽤户之前的HTTP通信状态进⾏保存,⽐如执⾏⼀次登陆操作,在30分钟内所有的请求都不需要再次登陆。于是引⼊了Cookie技术。
HTTP/1.1想出了持久连接(HTTP keep-alive)⽅法。其特点是,只要任意⼀端没有明确提出断开连接,则保持TCP连接状态,在请求⾸部字段中的Connection: keep-alive即为表明使⽤了持久连接。
等等还有很多。。。。。。
下⾯开始讲解重头戏:HTTP请求报⽂,响应报⽂,对应于上述步骤的2,3,4,5,6。
HTTP报⽂是⾯向⽂本的,报⽂中的每⼀个字段都是⼀些ASCII码串,各个字段的长度是不确定的。HTTP有两类报⽂:请求报⽂和响应报⽂。
五、HTTP请求报⽂
⼀个HTTP请求报⽂由请求⾏(request line)、请求头部(header)、空⾏和请求数据4个部分组成,下图给出了请求报⽂的⼀般格式。
1.请求⾏
请求⾏分为三个部分:请求⽅法、请求地址和协议版本
请求⽅法
HTTP/1.1 定义的请求⽅法有8种:GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、TRACE。最常的两种GET和POST,如果是RESTful接⼝的话⼀般会⽤到GET、POST、DELETE、PUT。
请求地址
URL:统⼀资源定位符,是⼀种⾃愿位置的抽象唯⼀识别⽅法。
组成:<;协议>://<;主机>:<;端⼝>/<;路径>
端⼝和路径有时可以省略(HTTP默认端⼝号是80)
如下例:
有时会带参数,GET请求
协议版本
协议版本的格式为:HTTP/主版本号.次版本号,常⽤的有HTTP/1.0和HTTP/1.1
2.请求头部
请求头部为请求报⽂添加了⼀些附加信息,由“名/值”对组成,每⾏⼀对,名和值之间使⽤冒号分隔。
常见请求头如下:
restful接口调用实例请求头部的最后会有⼀个空⾏,表⽰请求头部结束,接下来为请求数据,这⼀⾏⾮常重要,必不可少。
3.请求数据
可选部分,⽐如GET请求就没有请求数据。
下⾯是⼀个POST⽅法的请求报⽂:
六、HTTP响应报⽂
HTTP响应报⽂主要由状态⾏、响应头部、空⾏以及响应数据组成。
1.状态⾏
由3部分组成,分别为:协议版本,状态码,状态码描述。
其中协议版本与请求报⽂⼀致,状态码描述是对状态码的简单描述,所以这⾥就只介绍状态码。
状态码
状态代码为3位数字。
1xx:指⽰信息--表⽰请求已接收,继续处理。
2xx:成功--表⽰请求已被成功接收、理解、接受。
3xx:重定向--要完成请求必须进⾏更进⼀步的操作。
4xx:客户端错误--请求有语法错误或请求⽆法实现。
5xx:服务器端错误--服务器未能实现合法的请求。
下⾯列举⼏个常见的:
2.响应头部
与请求头部类似,为响应报⽂添加了⼀些附加信息
常见响应头部如下:
3.响应数据
⽤于存放需要返回给客户端的数据信息。
下⾯是⼀个响应报⽂的实例:
HTTP/1.1 200 OK 状态⾏
Date: Sun, 17 Mar 2013 08:12:54 GMT 响应头部
Server: Apache/2.2.8 (Win32) PHP/5.2.5
X-Powered-By: PHP/5.2.5
Set-Cookie: PHPSESSID=c0huq7pdkmm5gg6osoe3mgjmm3; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 4393
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8
空⾏
<html> 响应数据
<head>
<title>HTTP响应⽰例<title>
</head>
<body>
Hello HTTP!
</body>
</html>
关于请求头部和响应头部的知识点很多,这⾥只是简单介绍。
通过以上步骤,数据已经传递完毕,HTTP/1.1会维持持久连接,但持续⼀段时间总会有关闭连接的时候,这时候据需要断开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已经没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接受来⾃主机2的数据;当主机2返回ACK报⽂段时,
表⽰它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;当主机2也发送了FIN报⽂段时,这个时候就表⽰主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。
通过以上步骤便完成了HTTP的请求和响应,进⾏了数据传递,这其中涉及到需要知识点,都进⾏了逐⼀了解。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论