一次完整的HTTP请求与响应涉及了哪些知识?
阅读原文时间:2021年04月21日阅读:1

一次完整的HTTP请求与响应涉及了哪些知识?

2017-03-19 Ruheng Android订阅 Android订阅

Android订阅

微信号 androiddingyue

功能介绍 定时发布不一样的Android干货,关注Android技术和交流平台,让我们共同进步。

作者:Ruheng

地址:http://www.jianshu.com/p/c1d6a294d3c0

本文以HTTP请求和响应的过程来讲解涉及到的相关知识点。

第一

HTTP请求和相应步骤

图片来自:理解Http请求与响应http://android.jobbole.com/85218/

以上完整表示了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.请求头部

请求头部为请求报文添加了一些附加信息,由“名/值”对组成,每行一对,名和值之间使用冒号分隔。

常见请求头如下:

请求头部的最后会有一个空行,表示请求头部结束,接下来为请求数据,这一行非常重要,必不可少。

3.请求数据

可选部分,比如GET请求就没有请求数据。

下面是一个POST方法的请求报文:

POST  /index.php 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=aa&password=1234  请求数据

第六

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
  空行

  响应数据 HTTP响应示例<title> </head> <body> Hello HTTP! </body> </html></p> </blockquote> <p>关于请求头部和响应头部的知识点很多,这里只是简单介绍。</p> <p>通过以上步骤,数据已经传递完毕,HTTP/1.1会维持持久连接,但持续一段时间总会有关闭连接的时候,这时候据需要断开TCP连接。</p> <p>第七</p> <p>TCP四次挥手</p> <p>当客户端和服务器通过三次握手建立了TCP连接以后,当数据传送完毕,肯定是要断开TCP连接的啊。那对于TCP的断开连接,这里就有了神秘的“四次分手”。 </p> <p><img class='lazyload' data-src="https://article.cdnof.com/2104/41a5c268-f130-4ea3-ac4b-56104fefa09c.jpg" alt="" /> </p> <p>第一次分手:主机1(可以使客户端,也可以是服务器端),设置Sequence Number,向主机2发送一个FIN报文段;此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了;</p> <p>第二次分手:主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment Number为Sequence Number加1;主机1进入FIN_WAIT_2状态;主机2告诉主机1,我“同意”你的关闭请求;</p> <p>第三次分手:主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入LAST_ACK状态;</p> <p>第四次分手:主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。</p> <h5 id="为什么要四次分手">为什么要四次分手</h5> <p>TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。</p> <p>通过以上步骤便完成了HTTP的请求和响应,进行了数据传递,这其中涉及到需要知识点,都进行了逐一了解。</p> <p>参考文章 </p> <p>你需要了解的HTTP知识都在这里了!<a rel="nofollow noopener noreferrer" href="http://www.jianshu.com/p/a6d086a3997d">http://www.jianshu.com/p/a6d086a3997d</a> <br /> HTTP知识点总结<a rel="nofollow noopener noreferrer" href="http://www.jianshu.com/p/2ecd288d27ad">http://www.jianshu.com/p/2ecd288d27ad</a> <br /> 理解Http请求与响应<a rel="nofollow noopener noreferrer" href="http://android.jobbole.com/85218/">http://android.jobbole.com/85218/</a> <br /> HTTP-请求、响应、缓存<a rel="nofollow noopener noreferrer" href="https://cnbin.github.io/blog/2016/02/20/http-qing-qiu-,-xiang-ying-,-huan-cun/">https://cnbin.github.io/blog/2016/02/20/http-qing-qiu-,-xiang-ying-,-huan-cun/</a> <br /> 你应该知道的HTTP基础知识<a rel="nofollow noopener noreferrer" href="http://www.jianshu.com/p/e544b7a76dac">http://www.jianshu.com/p/e544b7a76dac</a> <br /> 整理Http知识点<a rel="nofollow noopener noreferrer" href="http://www.jellythink.com/archives/705">http://www.jellythink.com/archives/705</a> <br /> 简析TCP的三次握手与四次分手<a rel="nofollow noopener noreferrer" href="http://www.jellythink.com/archives/705">http://www.jellythink.com/archives/705</a> <br /> HTTP请求报文和HTTP响应报文<a rel="nofollow noopener noreferrer" href="http://www.cnblogs.com/biyeymyhjob/archive/2012/07/28/2612910.html">http://www.cnblogs.com/biyeymyhjob/archive/2012/07/28/2612910.html</a> <br /> TCP/IP协议簇分层详解<a rel="nofollow noopener noreferrer" href="http://blog.csdn.net/hankscpp/article/details/8611229">http://blog.csdn.net/hankscpp/article/details/8611229</a> <br /> HTTP请求报文和HTTP响应报文<a rel="nofollow noopener noreferrer" href="http://www.cnblogs.com/biyeymyhjob/archive/2012/07/28/2612910.html">http://www.cnblogs.com/biyeymyhjob/archive/2012/07/28/2612910.html</a></p> <p>END</p> <p>Android订阅是探讨Android开发的公众号,分享最有价值的Android干货文章 </p> <p>欢迎关注我们,一起讨论技术,扫描和长按下方的二维码可快速关注我们</p> <p><img class='lazyload' data-src="https://article.cdnof.com/2104/9328ec99-dd7d-455e-9898-e38b28a37790.jpg" alt="" /></p> <p><a rel="nofollow noopener noreferrer" href="##">阅读原文</a></p> <p>阅读</p> <p><a rel="nofollow noopener noreferrer" href="##">投诉</a></p></div></div><div class="MuiGrid-root jss8 MuiGrid-item MuiGrid-grid-xs-true MuiGrid-grid-md-3"><div class="MuiTypography-root jss26 MuiTypography-body1"><div class="MuiTypography-root jss27 MuiTypography-body1"><canvas style="height:108px;width:108px" height="108" width="108"></canvas><div class="MuiTypography-root jss28 MuiTypography-body1"><p class="MuiTypography-root jss29 MuiTypography-body1">手机扫一扫</p><p class="MuiTypography-root jss29 MuiTypography-body1">移动阅读更方便</p></div></div></div><div class="MuiTypography-root jss9 MuiTypography-body1"><div class="MuiTypography-root jss30 MuiTypography-body1" style="height:150px"><div class="swiper-container jss32"><div class="swiper-pagination"></div><div class="swiper-wrapper"><div class="swiper-slide jss32"><a class="MuiTypography-root MuiLink-root MuiLink-underlineHover jss32 MuiTypography-colorInherit" target="_blank" rel="nofollow noopener noreferrer" href="https://qd.rs/aliyun"><img alt="阿里云服务器" class="jss31" src="https://article.cdnof.com/promotion/aliyun.jpg"/></a></div><div class="swiper-slide jss32"><a class="MuiTypography-root MuiLink-root MuiLink-underlineHover jss32 MuiTypography-colorInherit" target="_blank" rel="nofollow noopener noreferrer" href="https://qd.rs/tencent"><img alt="腾讯云服务器" class="jss31" src="https://article.cdnof.com/promotion/tencent.jpg"/></a></div><div class="swiper-slide jss32"><a class="MuiTypography-root MuiLink-root MuiLink-underlineHover jss32 MuiTypography-colorInherit" target="_blank" rel="nofollow noopener noreferrer" href="https://qd.rs/qiniu"><img alt="七牛云服务器" class="jss31" src="https://article.cdnof.com/promotion/qiniu.png"/></a></div></div></div></div></div><div class="MuiTypography-root MuiTypography-body1"><div class="MuiTypography-root jss33 MuiTypography-body1"><p class="MuiTypography-root jss34 MuiTypography-body1">你可能感兴趣的文章</p><div class="MuiList-root MuiList-padding" aria-label="main mailbox folders"><div class="MuiTypography-root MuiTypography-body1"><div class="MuiButtonBase-root MuiListItem-root jss37 MuiListItem-gutters MuiListItem-button" tabindex="0" role="button" aria-disabled="false"><div class="MuiListItemIcon-root jss36"><svg class="MuiSvgIcon-root MuiSvgIcon-colorError" focusable="false" viewBox="0 0 24 24" aria-hidden="true"><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-5 14h-2V9h-2V7h4v10z"></path></svg></div><a class="MuiTypography-root MuiLink-root MuiLink-underlineHover jss35 MuiTypography-colorInherit" target="_blank" href="https://v2as.com/article/f472f8ba-4248-46b5-bd29-a1ce42f5b0e6">代码审计[java安全编程]</a></div><hr class="MuiDivider-root"/></div><div class="MuiTypography-root MuiTypography-body1"><div class="MuiButtonBase-root MuiListItem-root jss37 MuiListItem-gutters MuiListItem-button" tabindex="0" role="button" aria-disabled="false"><div class="MuiListItemIcon-root jss36"><svg class="MuiSvgIcon-root" focusable="false" viewBox="0 0 24 24" aria-hidden="true"><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-4 8c0 1.11-.9 2-2 2h-2v2h4v2H9v-4c0-1.11.9-2 2-2h2V9H9V7h4c1.1 0 2 .89 2 2v2z"></path></svg></div><a class="MuiTypography-root MuiLink-root MuiLink-underlineHover jss35 MuiTypography-colorInherit" target="_blank" href="https://v2as.com/article/1b141a02-ae28-4b40-be1a-24fcd61e306b">Linux内核源代码阅读</a></div><hr class="MuiDivider-root"/></div><div class="MuiTypography-root MuiTypography-body1"><div class="MuiButtonBase-root MuiListItem-root jss37 MuiListItem-gutters MuiListItem-button" tabindex="0" role="button" aria-disabled="false"><div class="MuiListItemIcon-root jss36"><svg class="MuiSvgIcon-root MuiSvgIcon-colorSecondary" focusable="false" viewBox="0 0 24 24" aria-hidden="true"><path d="M19.01 3h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-4 7.5c0 .83-.67 1.5-1.5 1.5.83 0 1.5.67 1.5 1.5V15c0 1.11-.9 2-2 2h-4v-2h4v-2h-2v-2h2V9h-4V7h4c1.1 0 2 .89 2 2v1.5z"></path></svg></div><a class="MuiTypography-root MuiLink-root MuiLink-underlineHover jss35 MuiTypography-colorInherit" target="_blank" href="https://v2as.com/article/9d96b6f9-8995-4582-97de-9daa71d9a3e3">SSL工作原理概述</a></div><hr class="MuiDivider-root"/></div><div class="MuiTypography-root MuiTypography-body1"><div class="MuiButtonBase-root MuiListItem-root jss37 MuiListItem-gutters MuiListItem-button" tabindex="0" role="button" aria-disabled="false"><div class="MuiListItemIcon-root jss36"><p class="MuiTypography-root MuiTypography-body1">4</p></div><a class="MuiTypography-root MuiLink-root MuiLink-underlineHover jss35 MuiTypography-colorInherit" target="_blank" href="https://v2as.com/article/8cab9b73-fa79-4ffc-a76c-e218d44e95d2">实验二:SQL server 2005高可用性之----数据库镜像</a></div><hr class="MuiDivider-root"/></div><div class="MuiTypography-root MuiTypography-body1"><div class="MuiButtonBase-root MuiListItem-root jss37 MuiListItem-gutters MuiListItem-button" tabindex="0" role="button" aria-disabled="false"><div class="MuiListItemIcon-root jss36"><p class="MuiTypography-root MuiTypography-body1">5</p></div><a class="MuiTypography-root MuiLink-root MuiLink-underlineHover jss35 MuiTypography-colorInherit" target="_blank" href="https://v2as.com/article/eca5a54c-799b-4b49-b18f-3b3843549b20">201871030112-贾傲羊 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告</a></div><hr class="MuiDivider-root"/></div><div class="MuiTypography-root MuiTypography-body1"><div class="MuiButtonBase-root MuiListItem-root jss37 MuiListItem-gutters MuiListItem-button" tabindex="0" role="button" aria-disabled="false"><div class="MuiListItemIcon-root jss36"><p class="MuiTypography-root MuiTypography-body1">6</p></div><a class="MuiTypography-root MuiLink-root MuiLink-underlineHover jss35 MuiTypography-colorInherit" target="_blank" href="https://v2as.com/article/16c2faa0-80fd-458a-a741-ec5bb7130c78">使用 shell 做 tcp 协议模拟</a></div><hr class="MuiDivider-root"/></div><div class="MuiTypography-root MuiTypography-body1"><div class="MuiButtonBase-root MuiListItem-root jss37 MuiListItem-gutters MuiListItem-button" tabindex="0" role="button" aria-disabled="false"><div class="MuiListItemIcon-root jss36"><p class="MuiTypography-root MuiTypography-body1">7</p></div><a class="MuiTypography-root MuiLink-root MuiLink-underlineHover jss35 MuiTypography-colorInherit" target="_blank" href="https://v2as.com/article/fb3bd92f-7aad-43f7-9da8-a759f02a190a">一些大牛的博客推荐,排名不分先后</a></div><hr class="MuiDivider-root"/></div><div class="MuiTypography-root MuiTypography-body1"><div class="MuiButtonBase-root MuiListItem-root jss37 MuiListItem-gutters MuiListItem-button" tabindex="0" role="button" aria-disabled="false"><div class="MuiListItemIcon-root jss36"><p class="MuiTypography-root MuiTypography-body1">8</p></div><a class="MuiTypography-root MuiLink-root MuiLink-underlineHover jss35 MuiTypography-colorInherit" target="_blank" href="https://v2as.com/article/ee091a58-ab3d-402f-a08b-5145093e68a9">阿里云CentOS7 Samba安装</a></div><hr class="MuiDivider-root"/></div><div class="MuiTypography-root MuiTypography-body1"><div class="MuiButtonBase-root MuiListItem-root jss37 MuiListItem-gutters MuiListItem-button" tabindex="0" role="button" aria-disabled="false"><div class="MuiListItemIcon-root jss36"><p class="MuiTypography-root MuiTypography-body1">9</p></div><a class="MuiTypography-root MuiLink-root MuiLink-underlineHover jss35 MuiTypography-colorInherit" target="_blank" href="https://v2as.com/article/0826e695-5984-4b8a-9262-49c82cd3b078">nginx的安装、管理、配置与调试</a></div><hr class="MuiDivider-root"/></div><div class="MuiTypography-root MuiTypography-body1"><div class="MuiButtonBase-root MuiListItem-root jss37 MuiListItem-gutters MuiListItem-button" tabindex="0" role="button" aria-disabled="false"><div class="MuiListItemIcon-root jss36"><p class="MuiTypography-root MuiTypography-body1">10</p></div><a class="MuiTypography-root MuiLink-root MuiLink-underlineHover jss35 MuiTypography-colorInherit" target="_blank" href="https://v2as.com/article/611d254b-a5b1-44ed-ab0f-386ac651e20e">jbpm学习</a></div></div></div></div></div></div></div></div><footer style="margin-top:30px"><p class="MuiTypography-root MuiTypography-body2 MuiTypography-colorTextSecondary MuiTypography-alignCenter">Copyright © <a class="MuiTypography-root MuiLink-root MuiLink-underlineHover MuiTypography-colorInherit" href="https://v2as.com" title="哇哦,有大量工具等你探索">V2AS | 问路</a> <!-- -->2023<!-- --> <!-- -->.</p><p class="MuiTypography-root MuiTypography-body2 MuiTypography-colorTextSecondary MuiTypography-alignCenter"><a class="MuiTypography-root MuiLink-root MuiLink-underlineHover MuiTypography-colorInherit" rel="nofollow noopener noreferrer" href="https://beian.miit.gov.cn/">浙ICP备15029886号</a></p></footer></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"article":{"article_id":"9e105a80-4e2a-46d5-8b22-4dd534546c10","title":"一次完整的HTTP请求与响应涉及了哪些知识?","link":"","description":"一次完整的HTTP请求与响应涉及了哪些知识? \n \n 2017-03-19 \n Ruheng \n Android订阅 \n Android订阅 \n \n \n Android订阅 \n \n 微信号 androiddingyue \n 功能介绍 定时发布不一样的Android干货,关注Android技术和交流平台,让我们共同进步。 \n \n \n ","image":"https://article.cdnof.com/2104/47c0a62e-efb1-463b-bdba-d0985b773be6.jpg","keywords":["HTTP","请求","TCP","var","报文","协议","IP","连接","响应","http"],"created_at":"2021-04-20T22:01:17.7Z","html":"\u003ch2 id=\"一次完整的http请求与响应涉及了哪些知识?\"\u003e一次完整的HTTP请求与响应涉及了哪些知识?\u003c/h2\u003e\n\u003cp\u003e\u003cem\u003e2017-03-19\u003c/em\u003e \u003cem\u003eRuheng\u003c/em\u003e \u003ca rel=\"nofollow noopener noreferrer\" href=\"##\"\u003eAndroid订阅\u003c/a\u003e Android订阅\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eAndroid订阅\u003c/strong\u003e \u003c/p\u003e\n\u003cp\u003e微信号 androiddingyue\u003c/p\u003e\n\u003cp\u003e功能介绍 定时发布不一样的Android干货,关注Android技术和交流平台,让我们共同进步。\u003c/p\u003e\n\u003cp\u003e\u003cimg class='lazyload' data-src=\"https://article.cdnof.com/2104/47c0a62e-efb1-463b-bdba-d0985b773be6.jpg\" alt=\"\" /\u003e \u003c/p\u003e\n\u003cblockquote\u003e\n \u003cp\u003e作者:Ruheng\u003c/p\u003e\n \u003cp\u003e地址:\u003ca rel=\"nofollow noopener noreferrer\" href=\"http://www.jianshu.com/p/c1d6a294d3c0\"\u003ehttp://www.jianshu.com/p/c1d6a294d3c0\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n \u003cp\u003e本文以HTTP请求和响应的过程来讲解涉及到的相关知识点。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e第一\u003c/p\u003e\n\u003cp\u003eHTTP请求和相应步骤\u003c/p\u003e\n\u003cp\u003e\u003cimg class='lazyload' data-src=\"https://article.cdnof.com/2104/38382f6e-d985-4617-bd93-82bac39a5620.jpg\" alt=\"\" /\u003e \u003c/p\u003e\n\u003cp\u003e图片来自:理解Http请求与响应\u003ca rel=\"nofollow noopener noreferrer\" href=\"http://android.jobbole.com/85218/\"\u003ehttp://android.jobbole.com/85218/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e以上完整表示了HTTP请求和响应的7个步骤,下面从TCP/IP协议模型的角度来理解HTTP请求和响应如何传递的。\u003c/p\u003e\n\u003cp\u003e第二\u003c/p\u003e\n\u003cp\u003eTCP/IP协议\u003c/p\u003e\n\u003cp\u003eTCP/IP协议模型(Transmission Control Protocol/Internet Protocol),包含了一系列构成互联网基础的网络协议,是Internet的核心协议,通过20多年的发展已日渐成熟,并被广泛应用于局域网和广域网中,目前已成为事实上的国际标准。TCP/IP协议簇是一组不同层次上的多个协议的组合,通常被认为是一个四层协议系统,与OSI的七层模型相对应。\u003c/p\u003e\n\u003cp\u003eHTTP协议就是基于TCP/IP协议模型来传输信息的。 \u003c/p\u003e\n\u003cp\u003e\u003cimg class='lazyload' data-src=\"https://article.cdnof.com/2104/470199aa-556a-4e87-959a-c9e8f3324335.jpg\" alt=\"\" /\u003e \u003c/p\u003e\n\u003cp\u003e(1). 链路层\u003c/p\u003e\n\u003cp\u003e也称作数据链路层或网络接口层(在第一个图中为网络接口层和硬件层),通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆(或其他任何传输媒介)的物理接口细节。ARP(地址解析协议)和RARP(逆地址解析协议)是某些网络接口(如以太网和令牌环网)使用的特殊协议,用来转换IP层和网络接口层使用的地址。\u003c/p\u003e\n\u003cp\u003e(2). 网络层\u003c/p\u003e\n\u003cp\u003e也称作互联网层(在第一个图中为网际层),处理分组在网络中的活动,例如分组的选路。在TCP/IP协议族中,网络层协议包括IP协议(网际协议),ICMP协议(Internet互联网控制报文协议),以及IGMP协议(Internet组管理协议)。\u003c/p\u003e\n\u003cp\u003eIP是一种网络层协议,提供的是一种不可靠的服务,它只是尽可能快地把分组从源结点送到目的结点,但是并不提供任何可靠性保证。同时被TCP和UDP使用。TCP和UDP的每组数据都通过端系统和每个中间路由器中的IP层在互联网中进行传输。\u003c/p\u003e\n\u003cp\u003eICMP是IP协议的附属协议。IP层用它来与其他主机或路由器交换错误报文和其他重要信息。\u003c/p\u003e\n\u003cp\u003eIGMP是Internet组管理协议。它用来把一个UDP数据报多播到多个主机。\u003c/p\u003e\n\u003cp\u003e(3). 传输层\u003c/p\u003e\n\u003cp\u003e主要为两台主机上的应用程序提供端到端的通信。在TCP/IP协议族中,有两个互不相同的传输协议:TCP(传输控制协议)和UDP(用户数据报协议)。\u003c/p\u003e\n\u003cp\u003eTCP为两台主机提供高可靠性的数据通信。它所做的工作包括把应用程序交给它的数据分成合适的小块交给下面的网络层,确认接收到的分组,设置发送最后确认分组的超时时钟等。由于运输层提供了高可靠性的端到端的通信,因此应用层可以忽略所有这些细节。为了提供可靠的服务,TCP采用了超时重传、发送和接收端到端的确认分组等机制。\u003c/p\u003e\n\u003cp\u003eUDP则为应用层提供一种非常简单的服务。它只是把称作数据报的分组从一台主机发送到另一台主机,但并不保证该数据报能到达另一端。一个数据报是指从发送方传输到接收方的一个信息单元(例如,发送方指定的一定字节数的信息)。UDP协议任何必需的可靠性必须由应用层来提供。 \u003cbr /\u003e\n(4). 应用层\u003c/p\u003e\n\u003cp\u003e应用层决定了向用户提供应用服务时通信的活动。TCP/IP 协议族内预存了各类通用的应用服务。包括 HTTP,FTP(File Transfer Protocol,文件传输协议),DNS(Domain Name System,域名系统)服务。 \u003c/p\u003e\n\u003cp\u003e当应用程序用TCP传送数据时,数据被送入协议栈中,然后逐个通过每一层直到被当作一串比特流送入网络。其中每一层对收到的数据都要增加一些首部信息(有时还要增加尾部信息),该过程如图所示。\u003c/p\u003e\n\u003cp\u003e\u003cimg class='lazyload' data-src=\"https://article.cdnof.com/2104/40a32110-eb75-47c8-87fc-2aed66664b14.jpg\" alt=\"\" /\u003e \u003c/p\u003e\n\u003cp\u003e当目的主机收到一个以太网数据帧时,数据就开始从协议栈中由底向上升,同时去掉各层协议加上的报文首部。每层协议盒都要去检查报文首部中的协议标识,以确定接收数据的上层协议。这个过程称作分用(Demultiplexing)。协议是通过目的端口号、源I P地址和源端口号进行解包的。\u003c/p\u003e\n\u003cp\u003e通过以上步骤我们从TCP/IP模型的角度来理解了一次HTTP请求与响应的过程。\u003c/p\u003e\n\u003cp\u003e下面这张图更清楚明白:\u003c/p\u003e\n\u003cp\u003e\u003cimg class='lazyload' data-src=\"https://article.cdnof.com/2104/9d64ae1b-22ba-4b28-b1c5-0d3a75cd0010.jpg\" alt=\"\" /\u003e \u003c/p\u003e\n\u003cp\u003e下面具体来看如何进行一步步操作的。\u003c/p\u003e\n\u003cp\u003e第三\u003c/p\u003e\n\u003cp\u003eTCP三次握手\u003c/p\u003e\n\u003cp\u003eTCP是面向连接的,无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。在TCP/IP协议中,TCP协议提供可靠的连接服务,连接是通过三次握手进行初始化的。三次握手的目的是同步连接双方的序列号和确认号并交换 TCP窗口大小信息。 \u003c/p\u003e\n\u003cp\u003e\u003cimg class='lazyload' data-src=\"https://article.cdnof.com/2104/e0eabc0f-d3e2-4bd7-91be-df454ae8b5f5.jpg\" alt=\"\" /\u003e \u003c/p\u003e\n\u003cp\u003e第一次握手:建立连接。客户端发送连接请求报文段,将SYN位置为1,Sequence Number为x;然后,客户端进入SYN_SEND状态,等待服务器的确认;\u003c/p\u003e\n\u003cp\u003e第二次握手:服务器收到SYN报文段。服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置Acknowledgment Number为x+1(Sequence Number+1);同时,自己自己还要发送SYN请求信息,将SYN位置为1,Sequence Number为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态;\u003c/p\u003e\n\u003cp\u003e第三次握手:客户端收到服务器的SYN+ACK报文段。然后将Acknowledgment Number设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。\u003c/p\u003e\n\u003ch5 id=\"为什么要三次握手\"\u003e为什么要三次握手\u003c/h5\u003e\n\u003cp\u003e为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。\u003c/p\u003e\n\u003cp\u003e具体例子:“已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。”\u003c/p\u003e\n\u003cp\u003e第四\u003c/p\u003e\n\u003cp\u003eHTTP协议\u003c/p\u003e\n\u003ch5 id=\"http是什么?\"\u003eHttp是什么?\u003c/h5\u003e\n\u003cp\u003e通俗来讲,他就是计算机通过网络进行通信的规则,是一个基于请求与响应,无状态的,应用层的协议,常基于TCP/IP协议传输数据。目前任何终端(手机,笔记本电脑。。)之间进行任何一种通信都必须按照Http协议进行,否则无法连接。\u003c/p\u003e\n\u003cp\u003e四个基于:\u003c/p\u003e\n\u003cp\u003e请求与响应:客户端发送请求,服务器端响应数据\u003c/p\u003e\n\u003cp\u003e无状态的:协议对于事务处理没有记忆能力,客户端第一次与服务器建立连接发送请求时需要进行一系列的安全认证匹配等,因此增加页面等待时间,当客户端向服务器端发送请求,服务器端响应完毕后,两者断开连接,也不保存连接状态,一刀两断!恩断义绝!从此路人!下一次客户端向同样的服务器发送请求时,由于他们之前已经遗忘了彼此,所以需要重新建立连接。\u003c/p\u003e\n\u003cp\u003e应用层:Http是属于应用层的协议,配合TCP/IP使用。\u003c/p\u003e\n\u003cp\u003eTCP/IP:Http使用TCP作为它的支撑运输协议。HTTP客户机发起一个与服务器的TCP连接,一旦连接建立,浏览器(客户机)和服务器进程就可以通过套接字接口访问TCP。\u003c/p\u003e\n\u003cp\u003e针对无状态的一些解决策略:\u003c/p\u003e\n\u003cp\u003e有时需要对用户之前的HTTP通信状态进行保存,比如执行一次登陆操作,在30分钟内所有的请求都不需要再次登陆。于是引入了Cookie技术。\u003c/p\u003e\n\u003cp\u003eHTTP/1.1想出了持久连接(HTTP keep-alive)方法。其特点是,只要任意一端没有明确提出断开连接,则保持TCP连接状态,在请求首部字段中的Connection: keep-alive即为表明使用了持久连接。 \u003cbr /\u003e\n等等还有很多。。。。。。\u003c/p\u003e\n\u003cp\u003e下面开始讲解重头戏:HTTP请求报文,响应报文,对应于上述步骤的2,3,4,5,6。\u003c/p\u003e\n\u003cp\u003eHTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的。HTTP有两类报文:请求报文和响应报文。\u003c/p\u003e\n\u003cp\u003e第五\u003c/p\u003e\n\u003cp\u003eHTTP请求报文\u003c/p\u003e\n\u003cp\u003e一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成,下图给出了请求报文的一般格式。 \u003c/p\u003e\n\u003cp\u003e\u003cimg class='lazyload' data-src=\"https://article.cdnof.com/2104/52d4bbf8-a210-40a1-87b1-6d76423e17cc.jpg\" alt=\"\" /\u003e \u003c/p\u003e\n\u003ch5 id=\"1请求行\"\u003e1.请求行\u003c/h5\u003e\n\u003cp\u003e请求行分为三个部分:请求方法、请求地址和协议版本\u003c/p\u003e\n\u003cp\u003e请求方法\u003c/p\u003e\n\u003cp\u003eHTTP/1.1 定义的请求方法有8种:GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、TRACE。\u003c/p\u003e\n\u003cp\u003e最常的两种GET和POST,如果是RESTful接口的话一般会用到GET、POST、DELETE、PUT。\u003c/p\u003e\n\u003cp\u003e请求地址\u003c/p\u003e\n\u003cp\u003eURL:统一资源定位符,是一种自愿位置的抽象唯一识别方法。\u003c/p\u003e\n\u003cp\u003e组成:\u003c协议\u003e://\u003c主机\u003e:\u003c端口\u003e/\u003c路径\u003e\u003c/p\u003e\n\u003cp\u003e端口和路径有时可以省略(HTTP默认端口号是80)\u003c/p\u003e\n\u003cp\u003e如下例: \u003c/p\u003e\n\u003cp\u003e有时会带参数,GET请求\u003c/p\u003e\n\u003cp\u003e协议版本\u003c/p\u003e\n\u003cp\u003e协议版本的格式为:HTTP/主版本号.次版本号,常用的有HTTP/1.0和HTTP/1.1\u003c/p\u003e\n\u003ch5 id=\"2请求头部\"\u003e2.请求头部\u003c/h5\u003e\n\u003cp\u003e请求头部为请求报文添加了一些附加信息,由“名/值”对组成,每行一对,名和值之间使用冒号分隔。\u003c/p\u003e\n\u003cp\u003e常见请求头如下: \u003c/p\u003e\n\u003cp\u003e\u003cimg class='lazyload' data-src=\"https://article.cdnof.com/2104/22c56d9c-4b71-44ee-809e-17f3256f293b.jpg\" alt=\"\" /\u003e \u003c/p\u003e\n\u003cp\u003e请求头部的最后会有一个空行,表示请求头部结束,接下来为请求数据,这一行非常重要,必不可少。\u003c/p\u003e\n\u003ch5 id=\"3请求数据\"\u003e3.请求数据\u003c/h5\u003e\n\u003cp\u003e可选部分,比如GET请求就没有请求数据。\u003c/p\u003e\n\u003cp\u003e下面是一个POST方法的请求报文:\u003c/p\u003e\n\u003cblockquote\u003e\n \u003cp\u003ePOST  /index.php HTTP/1.1    请求行 \u003cbr /\u003e\n Host: localhost \u003cbr /\u003e\n User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2  请求头 \u003cbr /\u003e\n Accept: text/html,application/xhtml+xml,application/xml;q=0.9,\u003cem\u003e/\u003c/em\u003e;q=0.8 \u003cbr /\u003e\n Accept-Language: zh-cn,zh;q=0.5 \u003cbr /\u003e\n Accept-Encoding: gzip, deflate \u003cbr /\u003e\n Connection: keep-alive \u003cbr /\u003e\n Referer:\u0026nbsp;http://localhost/ \u003cbr /\u003e\n Content-Length:25 \u003cbr /\u003e\n Content-Type:application/x-www-form-urlencoded \u003cbr /\u003e\n   空行 \u003cbr /\u003e\n username=aa\u0026amp;password=1234  请求数据\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e第六\u003c/p\u003e\n\u003cp\u003eHTTP响应报文\u003c/p\u003e\n\u003cp\u003eHTTP响应报文主要由状态行、响应头部、空行以及响应数据组成。\u003c/p\u003e\n\u003ch5 id=\"1状态行\"\u003e1.状态行\u003c/h5\u003e\n\u003cp\u003e由3部分组成,分别为:协议版本,状态码,状态码描述。\u003c/p\u003e\n\u003cp\u003e其中协议版本与请求报文一致,状态码描述是对状态码的简单描述,所以这里就只介绍状态码。\u003c/p\u003e\n\u003cp\u003e状态码\u003c/p\u003e\n\u003cp\u003e状态代码为3位数字。 \u003cbr /\u003e\n1xx:指示信息--表示请求已接收,继续处理。 \u003cbr /\u003e\n2xx:成功--表示请求已被成功接收、理解、接受。 \u003cbr /\u003e\n3xx:重定向--要完成请求必须进行更进一步的操作。 \u003cbr /\u003e\n4xx:客户端错误--请求有语法错误或请求无法实现。 \u003cbr /\u003e\n5xx:服务器端错误--服务器未能实现合法的请求。\u003c/p\u003e\n\u003cp\u003e下面列举几个常见的:\u003c/p\u003e\n\u003ch5 id=\"2响应头部\"\u003e2.响应头部\u003c/h5\u003e\n\u003cp\u003e与请求头部类似,为响应报文添加了一些附加信息\u003c/p\u003e\n\u003cp\u003e常见响应头部如下:\u003c/p\u003e\n\u003cp\u003e\u003cimg class='lazyload' data-src=\"https://article.cdnof.com/2104/39d43140-ed46-4c75-9a70-33e188743ee4.jpg\" alt=\"\" /\u003e \u003c/p\u003e\n\u003ch5 id=\"3响应数据\"\u003e3.响应数据\u003c/h5\u003e\n\u003cp\u003e用于存放需要返回给客户端的数据信息。\u003c/p\u003e\n\u003cp\u003e下面是一个响应报文的实例:\u003c/p\u003e\n\u003cblockquote\u003e\n \u003cp\u003eHTTP/1.1 200 OK  状态行 \u003cbr /\u003e\n Date: Sun, 17 Mar 2013 08:12:54 GMT  响应头部 \u003cbr /\u003e\n Server: Apache/2.2.8 (Win32) PHP/5.2.5 \u003cbr /\u003e\n X-Powered-By: PHP/5.2.5 \u003cbr /\u003e\n Set-Cookie: PHPSESSID=c0huq7pdkmm5gg6osoe3mgjmm3; path=/ \u003cbr /\u003e\n Expires: Thu, 19 Nov 1981 08:52:00 GMT \u003cbr /\u003e\n Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 \u003cbr /\u003e\n Pragma: no-cache \u003cbr /\u003e\n Content-Length: 4393 \u003cbr /\u003e\n Keep-Alive: timeout=5, max=100 \u003cbr /\u003e\n Connection: Keep-Alive \u003cbr /\u003e\n Content-Type: text/html; charset=utf-8 \u003cbr /\u003e\n   空行\u003c/p\u003e\n \u003cp\u003e\u003chtml\u003e  响应数据 \n\u003chead\u003e \n\u003ctitle\u003eHTTP响应示例\u003ctitle\u003e \n\u003c/head\u003e \n\u003cbody\u003e \nHello HTTP! \n\u003c/body\u003e \n\u003c/html\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e关于请求头部和响应头部的知识点很多,这里只是简单介绍。\u003c/p\u003e\n\u003cp\u003e通过以上步骤,数据已经传递完毕,HTTP/1.1会维持持久连接,但持续一段时间总会有关闭连接的时候,这时候据需要断开TCP连接。\u003c/p\u003e\n\u003cp\u003e第七\u003c/p\u003e\n\u003cp\u003eTCP四次挥手\u003c/p\u003e\n\u003cp\u003e当客户端和服务器通过三次握手建立了TCP连接以后,当数据传送完毕,肯定是要断开TCP连接的啊。那对于TCP的断开连接,这里就有了神秘的“四次分手”。 \u003c/p\u003e\n\u003cp\u003e\u003cimg class='lazyload' data-src=\"https://article.cdnof.com/2104/41a5c268-f130-4ea3-ac4b-56104fefa09c.jpg\" alt=\"\" /\u003e \u003c/p\u003e\n\u003cp\u003e第一次分手:主机1(可以使客户端,也可以是服务器端),设置Sequence Number,向主机2发送一个FIN报文段;此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了;\u003c/p\u003e\n\u003cp\u003e第二次分手:主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment Number为Sequence Number加1;主机1进入FIN_WAIT_2状态;主机2告诉主机1,我“同意”你的关闭请求;\u003c/p\u003e\n\u003cp\u003e第三次分手:主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入LAST_ACK状态;\u003c/p\u003e\n\u003cp\u003e第四次分手:主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。\u003c/p\u003e\n\u003ch5 id=\"为什么要四次分手\"\u003e为什么要四次分手\u003c/h5\u003e\n\u003cp\u003eTCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。\u003c/p\u003e\n\u003cp\u003e通过以上步骤便完成了HTTP的请求和响应,进行了数据传递,这其中涉及到需要知识点,都进行了逐一了解。\u003c/p\u003e\n\u003cp\u003e参考文章 \u003c/p\u003e\n\u003cp\u003e你需要了解的HTTP知识都在这里了!\u003ca rel=\"nofollow noopener noreferrer\" href=\"http://www.jianshu.com/p/a6d086a3997d\"\u003ehttp://www.jianshu.com/p/a6d086a3997d\u003c/a\u003e \u003cbr /\u003e\nHTTP知识点总结\u003ca rel=\"nofollow noopener noreferrer\" href=\"http://www.jianshu.com/p/2ecd288d27ad\"\u003ehttp://www.jianshu.com/p/2ecd288d27ad\u003c/a\u003e \u003cbr /\u003e\n理解Http请求与响应\u003ca rel=\"nofollow noopener noreferrer\" href=\"http://android.jobbole.com/85218/\"\u003ehttp://android.jobbole.com/85218/\u003c/a\u003e \u003cbr /\u003e\nHTTP-请求、响应、缓存\u003ca rel=\"nofollow noopener noreferrer\" href=\"https://cnbin.github.io/blog/2016/02/20/http-qing-qiu-,-xiang-ying-,-huan-cun/\"\u003ehttps://cnbin.github.io/blog/2016/02/20/http-qing-qiu-,-xiang-ying-,-huan-cun/\u003c/a\u003e \u003cbr /\u003e\n你应该知道的HTTP基础知识\u003ca rel=\"nofollow noopener noreferrer\" href=\"http://www.jianshu.com/p/e544b7a76dac\"\u003ehttp://www.jianshu.com/p/e544b7a76dac\u003c/a\u003e \u003cbr /\u003e\n整理Http知识点\u003ca rel=\"nofollow noopener noreferrer\" href=\"http://www.jellythink.com/archives/705\"\u003ehttp://www.jellythink.com/archives/705\u003c/a\u003e \u003cbr /\u003e\n简析TCP的三次握手与四次分手\u003ca rel=\"nofollow noopener noreferrer\" href=\"http://www.jellythink.com/archives/705\"\u003ehttp://www.jellythink.com/archives/705\u003c/a\u003e \u003cbr /\u003e\nHTTP请求报文和HTTP响应报文\u003ca rel=\"nofollow noopener noreferrer\" href=\"http://www.cnblogs.com/biyeymyhjob/archive/2012/07/28/2612910.html\"\u003ehttp://www.cnblogs.com/biyeymyhjob/archive/2012/07/28/2612910.html\u003c/a\u003e \u003cbr /\u003e\nTCP/IP协议簇分层详解\u003ca rel=\"nofollow noopener noreferrer\" href=\"http://blog.csdn.net/hankscpp/article/details/8611229\"\u003ehttp://blog.csdn.net/hankscpp/article/details/8611229\u003c/a\u003e \u003cbr /\u003e\nHTTP请求报文和HTTP响应报文\u003ca rel=\"nofollow noopener noreferrer\" href=\"http://www.cnblogs.com/biyeymyhjob/archive/2012/07/28/2612910.html\"\u003ehttp://www.cnblogs.com/biyeymyhjob/archive/2012/07/28/2612910.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eEND\u003c/p\u003e\n\u003cp\u003eAndroid订阅是探讨Android开发的公众号,分享最有价值的Android干货文章 \u003c/p\u003e\n\u003cp\u003e欢迎关注我们,一起讨论技术,扫描和长按下方的二维码可快速关注我们\u003c/p\u003e\n\u003cp\u003e\u003cimg class='lazyload' data-src=\"https://article.cdnof.com/2104/9328ec99-dd7d-455e-9898-e38b28a37790.jpg\" alt=\"\" /\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca rel=\"nofollow noopener noreferrer\" href=\"##\"\u003e阅读原文\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e阅读\u003c/p\u003e\n\u003cp\u003e\u003ca rel=\"nofollow noopener noreferrer\" href=\"##\"\u003e投诉\u003c/a\u003e\u003c/p\u003e"},"seo":{"title":"一次完整的HTTP请求与响应涉及了哪些知识?","description":"一次完整的HTTP请求与响应涉及了哪些知识? \n \n 2017-03-19 \n Ruheng \n Android订阅 \n Android订阅 \n \n \n Android订阅 \n \n 微信号 androiddingyue \n 功能介绍 定时发布不一样的Android干货,关注Android技术和交流平台,让我们共同进步。 \n \n \n ","image":"https://article.cdnof.com/2104/47c0a62e-efb1-463b-bdba-d0985b773be6.jpg","url":"https://v2as.com/article/9e105a80-4e2a-46d5-8b22-4dd534546c10","keywords":["HTTP","请求","TCP","var","报文","协议","IP","连接","响应","http"]},"viewsCount":1,"promotionList":[{"title":"阿里云服务器","image":"https://article.cdnof.com/promotion/aliyun.jpg","link":"https://qd.rs/aliyun"},{"title":"腾讯云服务器","image":"https://article.cdnof.com/promotion/tencent.jpg","link":"https://qd.rs/tencent"},{"title":"七牛云服务器","image":"https://article.cdnof.com/promotion/qiniu.png","link":"https://qd.rs/qiniu"}],"similarKeywordsList":[{"article_id":"f472f8ba-4248-46b5-bd29-a1ce42f5b0e6","title":"代码审计[java安全编程]","link":"","description":"SQL注入 \n介绍\n注入攻击的本质,是程序把用户输入的数据当做代码执行。这里有两个关键条件,第一是用户能够控制输入;第二是用户输入的数据被拼接到要执行的代码中从而被执行。sql注入漏洞则是程序将用户输入数据拼接到了sql语句中,从而攻击者即可构造、改变sql语义从而进行攻击。\n漏洞示例一:直接通过拼接sql\n@RequestMapping(\"/SqlInjection/{id}\")\npublic ","image":"","keywords":["new","String","public","示例","代码","class","java","审计","Java","漏洞"],"created_at":"0001-01-01T00:00:00Z"},{"article_id":"1b141a02-ae28-4b40-be1a-24fcd61e306b","title":"Linux内核源代码阅读","link":"","description":"这里提到的方式是: windows + source insight  \n \nSource Insight :  可以在CSDN上下载,如: http://download.csdn.net/detail/wwdlk/4695235#comment \n \n关于win7下使用source insight,没有Courier字体的解决方法,请参考: \nhttp://hi.baidu.com/rao","image":"","keywords":["Linux","源代码","内核","linux","var","进程","代码","阅读","精读","泛读"],"created_at":"0001-01-01T00:00:00Z"},{"article_id":"9d96b6f9-8995-4582-97de-9daa71d9a3e3","title":"SSL工作原理概述","link":"","description":"SSL工作原理 \n \n 本文非原创,图片等资源都来自原博,仅供学习之用。原博见脚注。 \n \n缩略语 \n缩略语英文名称解释AESAdvanced Encryption Standard高级加密标准CACertificate Authority证书机构DESData Encryption Standard数据加密标准HTTPSHypertext Transfer Protocol Secure安全超文","image":"https://article.cdnof.com/2104/b8c7060f-1171-4e11-8caa-ffb95f808e0a.jpg","keywords":["SSL","密钥","加密","var","SSLserver","SSLclient","算法","MAC","公钥","协议"],"created_at":"0001-01-01T00:00:00Z"},{"article_id":"8cab9b73-fa79-4ffc-a76c-e218d44e95d2","title":"实验二:SQL server 2005高可用性之----数据库镜像","link":"","description":"如转载,请注明出处:http://blog.csdn.net/robinson_0612/archive/2009/11/04/4769060.aspx \n   \n     SQL server 2005高可用性之数据库镜像,是SQL server 2005的新技术之一,是一种基于软件的高可用性解决方案,可以对不同服务器或同一服务器不同实例之间的数据库实验无数据延迟,自动故障转移的热备份。数据库","image":"","keywords":["镜像","数据库","服务器","var","SQL","dbo","高可用性","主体","AS","2005"],"created_at":"0001-01-01T00:00:00Z"},{"article_id":"eca5a54c-799b-4b49-b18f-3b3843549b20","title":"201871030112-贾傲羊 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告","link":"","description":"项目\n内容\n\n\n\n\n课程班级博客链接\n课程班级博客链接\n\n\n这个作业要求链接\n作业要求链接\n\n\n我的课程学习目标\n学习PSP流程并运用于结对项目;学习GitHub代码的管理;学习结对编程的流程与内容\n\n\n这个作业在哪些方面帮助我实现学习目标\n学习编程、学习算法、工程实践\n\n\n结对方学号-姓名\n201873030133-杨子豪\n\n\n结对方本次博客作业链接\n链接\n\n\n本项目Github的仓库链接地址\n","image":"https://article.cdnof.com/2104/411289b9-7cbf-43d7-b797-9871f1d24e48.jpg","keywords":["代码","结对","实验","项目","ac","数据","KP","编程","服务器端","referer"],"created_at":"0001-01-01T00:00:00Z"},{"article_id":"16c2faa0-80fd-458a-a741-ec5bb7130c78","title":"使用 shell 做 tcp 协议模拟","link":"","description":"问题背景\n公司有一套消息推送系统(简称GCM),由于人事变动接手了其中的客户端部分。看了一下文档,仅通讯协议部分有几页简单的说明,代码呢又多又乱,一时理不出一个头绪。由于消息是从后台推送到端的,所以使用了 tcp 长连接通道来保证消息的及时性,基于 http 的一堆分析工具(如 postman)完全没有用武之地,因此决定写个小工具来模拟 tcp 上的通讯协议,作为深入熟悉代码之前的热身。\n问题的解","image":"https://article.cdnof.com/2104/eb199028-77dc-45b1-9fea-22f0f5b7f21e.jpg","keywords":["TCP","127.0.0.1","echo","ESTABLISHED","msg","yunh","15","10.2.56.38","local","25"],"created_at":"0001-01-01T00:00:00Z"},{"article_id":"fb3bd92f-7aad-43f7-9da8-a759f02a190a","title":"一些大牛的博客推荐,排名不分先后","link":"","description":"今天看到一篇文章,收藏了很多大牛的博客,在这里分享一下(转载于:http://blog.csdn.net/wujxiaoz/article/details/8237096) \n Android中文Wiki \n \n AndroidStudio-NDK开发-移动开发团队\n \n \n 谦虚的天下 - 博客园\n \n \n gundumw100博客 - android进阶分类文章列表 - ITeye技术","image":"","keywords":["Android","博客","CSDN","NET","频道","android","专栏","博客园","开发","安卓"],"created_at":"0001-01-01T00:00:00Z"},{"article_id":"ee091a58-ab3d-402f-a08b-5145093e68a9","title":"阿里云CentOS7 Samba安装","link":"","description":"[阿里云服务 CentOS7 Samba安装] 因为阿里云CentOS7服务器默认的防火墙是firewalle,且samba和vsftp相关端口都是关闭的\n 先安装iptables 配置相关rule, 然后配置samba。\n \nPS:结合大家的分享整理一下自己安装过程。 \n \n一、iptables 配置 \n 1、安装iptables\n #先检查是否安装了iptables\n service ipt","image":"","keywords":["var","samba","iptables","安装","Samba","csdn","服务器","阿里","window","https"],"created_at":"0001-01-01T00:00:00Z"},{"article_id":"0826e695-5984-4b8a-9262-49c82cd3b078","title":"nginx的安装、管理、配置与调试","link":"","description":"前言 \n记性不好,遇到的相关nginx问题和解决方法都会扩充在上面,如有问题请留言。 \n目录 \n安装nginx \n 管理nginx配置nginx.conf nginx优点调试nginx参考 \n安装nginx \n装好gcc g++ 开发库环境 ubunto \n$ apt-get install build-essential\n$ apt-get install libtool\n \ncentos \n","image":"","keywords":["nginx","var","csdn","http","Nginx","location","安装","服务器","window","worker"],"created_at":"0001-01-01T00:00:00Z"},{"article_id":"611d254b-a5b1-44ed-ab0f-386ac651e20e","title":"jbpm学习","link":"","description":"1.      jBPM的简单介绍\n \n\n jBPM\n 是JBOSS下的一个开源java工作流项目,该项目提供eclipse插件,基于Hibernate实现数据持久化存储。\n \n\n    参考\n \n\n http://www.jboss.com/products/jbpm \n \n\n 2.      jBPM和myeclipse的冲突\n \n\n 当eclipse安装了myeclipse和jBPM时候,可","image":"https://article.cdnof.com/2104/e8696d8b-933f-4189-a68c-ea38742e19ce.bmp","keywords":["jbpm","java","org","jBPM","hibernate","流程","var","junit","xml","数据库"],"created_at":"0001-01-01T00:00:00Z"}]},"__N_SSG":true},"page":"/article/[article_id]","query":{"article_id":"9e105a80-4e2a-46d5-8b22-4dd534546c10"},"buildId":"7EtL49Y65E8zx1NwcIC_o","isFallback":false,"gsp":true,"scriptLoader":[]}</script></body></html>