JavaEE 要懂的小事:图解Http协议
<p>泥瓦匠记得和左潇龙【博客园】上次聊天时,龙哥问了个Session的问题。我当时的理解就是云里雾里,先从Http协议理解开始吧。</p> <h2><strong>一、技术基石及概述</strong></h2> <p><strong>问:</strong> 什么是HTTP?</p> <p><strong>答:</strong> HTTP是一个客户端和服务器端 <strong>请求</strong> 和 <strong>响应</strong> 的 <strong>标准TCP</strong> 。其实建立在TCP之上的。</p> <p>当我们打开百度网页时,是这样的:</p> <p><a href="/misc/goto?guid=4959739905389094978" rel="nofollow,noindex">https://www. baidu.com </a></p> <p>多了个S,其实S表示TLS、SSL。在这里不做解释,因此HTTP的技术基石如图所示:</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/9a486117d8d11fafae7dc1c022463167.png"></p> <p>那HTTP协议呢?HTTP协议(HyperText Transfer Protocol),即超文本传输协议是用于服务器传输到客户端浏览器的传输协议。Web上,服务器和客户端利用HTTP协议进行通信会话。有OOP思想的得出结论:其会话的结构是一个简单的请求/响应序列,即浏览器发出请求和服务器做出响应。</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/bf9fc5c934199b5e33c62962d9b400e2.png"></p> <h2><strong>二、深入理解技术基石和工作流程</strong></h2> <p>既然HTTP是基于传输层的TCP协议,而TCP协议是 <strong>面向连接</strong> 的 <strong>端到端</strong> 的协议。因此,使用HTTP协议传输前,首先建立TCP连接,就是因此在谈的TCP链接过程的“三次握手”。如图</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/d20fc9a58c949327e661fec3a95176b1.png"></p> <p>在Web上,HTTP协议使用TCP协议而不是UDP协议的原因在于一个网页必须传送很多数据,而且保证其完整性。TCP协议提供传输控制,按顺序组织数据和错误纠正的一系列功能。</p> <p>一次HTTP操作称为一个事务,其工作过程可分为四步:</p> <p>1、客户端与服务器需要建立连接。(比如某个超级链接,HTTP就开始了。)</p> <p>2、建立连接后,发送请求。</p> <p>3、服务器接到请求后,响应其响应信息。</p> <p>4、客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。</p> <p>建立连接,其实建立在TCP连接基础之上。图解核心工作过程(即省去连接过程)如下:</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/82d36c8e91e150f6a3fbc79f3c153baa.png"></p> <h2><strong>三、详解工作过程的HTTP报文</strong></h2> <p>HTTP报文由从客户机到服务器的请求和从服务器到客户机的响应构成。</p> <p>一、请求报文格式如下:</p> <p>请求行 通用信息头 请求头 实体头 <strong>(空行)</strong> 报文主体</p> <p>如图,请求我博客一篇文章时发送的报文内容:</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/0288fb59f19f82a3d0face1dffaad30f.png"></p> <p>对于其中请求报文详解:</p> <p>1、请求行</p> <p>方法字段 + URL + Http协议版本</p> <p>2、通用信息头</p> <p>Cache-Control头域:指定请求和响应遵循的缓存机制。</p> <p>keep-alive 是其连接持续有效【在下面百度的例子,会得到验证】</p> <p>3、请求头</p> <p>Host头域,脑补吧</p> <p>Referer头域:允许客户端指定请求URL的资源地址。</p> <p>User-Agent头域:请求用户信息。【可以看出一些客户端浏览器的内核信息】</p> <p>4、报文主体</p> <p>如图中的 “ p=278 ”一般来说,请求主体少不了请求参数。</p> <p>二、应答报文格式如下:</p> <p>状态行 通用信息头 响应头 实体头 <strong>(空行)</strong> 报文主体</p> <p>如图,就是这篇博客响应的内容:</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/d51d94e4c7866b7a744071f7543906e0.png"></p> <p>对其中响应报文详解:</p> <p>1、状态行</p> <p>HTTP协议版本 + 状态码 + 状态代码的文本描述</p> <p>【比如这里,200 代表请求成功】</p> <p>2、通用信息头</p> <p>keep-alive 是其连接持续有效【在下面百度的例子,会得到验证】</p> <p>Date头域:时间描述</p> <p>3、响应头</p> <p>Server头:处理请求的原始服务器的软件信息。</p> <p>4、实体头</p> <p>Content-Type头:便是接收方实体的介质类型。(这也表示了你的报文主体是什么。)</p> <p>(空行)</p> <p>5、报文主体</p> <p>这里就是HTML响应页面了,在截图tab页中的response中可查看。</p> <p>一次简单的请求/响应就完成了。</p> <h2><strong>三、HTTP协议知识补充</strong></h2> <p>请求报文相关:</p> <p>请求行-请求方法</p> <p>GET 请求获取Request-URI所标识的资源</p> <p>POST 在Request-URI所标识的资源后附加新的数据</p> <p>HEAD 请求获取由Request-URI所标识的资源的响应消息报头</p> <p>PUT 请求服务器存储一个资源,并用Request-URI作为其标识</p> <p>DELETE 请求服务器删除Request-URI所标识的资源</p> <p>TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断</p> <p>CONNECT 保留将来使用</p> <p>OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求</p> <p>响应报文相关:</p> <p>响应行-状态码</p> <p>1xx:指示信息–表示请求已接收,继续处理</p> <p>2xx:成功–表示请求已被成功接收、理解、接受</p> <p>3xx:重定向–要完成请求必须进行更进一步的操作</p> <p>4xx:客户端错误–请求有语法错误或请求无法实现</p> <p>5xx:服务器端错误–服务器未能实现合法的请求</p> <p>常见的状态码</p> <p><strong>200 OK</strong></p> <p>请求成功(其后是对GET和POST请求的应答文档。)</p> <p><strong>304 Not Modified</strong></p> <p>未按预期修改文档。客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。</p> <p><strong>404 Not Found</strong></p> <p>服务器无法找到被请求的页面。</p> <p><strong>500 Internal Server Error</strong></p> <p>请求未完成。服务器遇到不可预知的情况。</p> <p>比如304,在浏览器第一次打开百度时,如图所示:</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/f7f7e699d6835ecea1553350831f9621.png"></p> <p>刷新一下:</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/8ef7243db47a6f15b84adc5898deb530.png"></p> <p>这上面的304就证明了</p> <p>1、304状态码:有些图片和js文件在本地客户端缓存,再次请求后,缓存的文件可以使用。</p> <p>2、以上所以HTTP请求,只靠一个TCP连接,这就是所谓的 <strong>持久连接</strong> 。</p> <h2><strong>四、关于HTTP协议的Web应用框架或者规范</strong></h2> <p>JavaEE的人会知道Servlet规范。其中Web应用容器都实现了HTTP协议中的对象,即请求和响应对象。比如 javax.servlet.http.HttpServletResponse 对象中肯定有对状态码描述,如图</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/cbddf8f19556245168b0a38bf62711a8.png"></p> <p>至于如何使用它们,坐等系列文章吧。</p> <h2><strong>五、总结</strong></h2> <p>回顾全文,HTTP协议其实就是我们对话一样,语言就是其中的协议。所以掌握HTTP协议明白以下几点就好:</p> <ul> <li><strong>1、用什么通过HTTP协议通信</strong></li> <li><strong>2、怎么通过HTTP协议通信</strong></li> </ul> <p> </p> <p> </p> <p>来自:https://zhuanlan.zhihu.com/p/25518072</p> <p> </p>
本文由用户 gahd89757 自行上传分享,仅供网友学习交流。所有权归原作者,若您的权利被侵害,请联系管理员。
转载本站原创文章,请注明出处,并保留原始链接、图片水印。
本站是一个以用户分享为主的开源技术平台,欢迎各类分享!