一、协议介绍

  HTTP(HyperText Transfer Protocol,超文本传输协议)是一套计算机通过网络进行通信的规则,使HTTP客户端能够从HTTP服务器端请求到信息和服务,目前的版本号是1.1 是无状态协议,无状态是指从客户端发送HTTP请求到服务器,服务器接收到请求之后做出回应,这样链接就关闭了,在服务器端不需要保留客户端的相关信息。

二、协议过程

  HTTP通讯机制是在一次完整的HTTP通讯过程中,客户端和服务器之间建立连接分为以下几个步骤。

  1. 建立连接: 其中包括:域名解析,TCP三次握手。

    域名解析:将HTTP请求中的域名转化为IP地址,其中主要步骤有,以Chrome为例,访问www.baidu.com

    ① 首先,Chrome会搜索浏览器自身的DNS缓存(缓存较少),看自身有没有改域名的IP地址,如果有停止解析返回IP,如果没有继续解析。

      注解:Chrome中的DNS可以通过在浏览器中输入 chrome://net-internals/#dns 来进行查看浏览器DNS缓存。

     

    ② 如果在浏览器的自身的DNS缓存中没有找到,那么Chrome会搜索操作系统自身的DNS缓存,如果找到就停止,没有找到继续解析。

    注解:可以通过命令行  ipconfig /displaydns 来查看操作系统的DNS缓存。

      

    ③ 如果chrome在操作系统的DNS缓存中没有找到,那么会尝试读取host(C:\Windows\System32\drivers\etc)文件,看看这里面有没有对应的DNS地址

    

    ④ 如果host文件中没有找到,那么chrome会发送一个DNS系统调用, 会首先向默认的DNS服务器发送域名解析(一般默认的是网络运营商的,通过UDP协议向DNS的53端口发送请求),如果网络运营商有该域名缓存,那么返回IP,如果没有,该运营商的DNS会发起一个迭代DNS解析请求,首先找到根域名的IP地址,即com域的IP地址。运营商会继续想com域发送域名解析请求,获得baidu.com域的IP地址,进而获得需要解析域名的IP地址(如果www.baidu.com 这么难访问,那么就离退休不远了)。

    TCP三次握手:拿到域名的IP之后,client会以一个随机端口向web服务器指定端口(默认为80端口,有时候也有用8080端口的)发送TCP链接请求。

    

    

  2. 发送数据:

    client与server建立连接之后,client向server端发送数据包其中数据包中包含以下信息

    ⑴ 请求方法 URI协议/版本

    ⑵ 请求头(Request Header)

    ⑶ 请求正文

    eg.

    

GET/index.jspHTTP/1.1
Accept:image/gif.image/jpeg,*/*
Accept-Language:zh-cn
Connection:Keep-Alive
Host:localhost
User-Agent:Mozila/4.0(compatible;MSIE5.01;Window NT5.0)
Accept-Encoding:gzip,deflateusername=jinqiao&password=1234

    ⑴ 请求方法 URI协议/版本

    请求的第一行 GET/index.jsp HTTP/1.1

    “GET” 代表请求方法,“/index.jsp”代表URI协议,“HTTP/1.1”代表协议和协议版本,其中HTTP1.1 支持了七种方法,GET,POST,HEAD,PUT,DELETE,TRACE,CONNECT,OPTIONS. 下面主要说一下GET与POST方法。

    GET:默认的HTTP请求数据,只是对需要提交的信息进行了简单的编码,并将信息附加在URL地址之后 eg. Http://localhost/login.php?username=aa&password=1234 这样会产生将用户的信息暴露的危险。并且浏览器会对URL的长度进行限制,所以提交的信息也有限制。

    POST:主要作用是向web提交表单信息,克服了GET的不安全和数据长度限制的缺点,在发送数据时POST不会将数据附加在URL之后,相对GET方法安全(推荐使用POST方法)。

    ⑵ 请求头

    请求第二行之后就是请求头,其中包含了客户端环境的相关信息,包含:浏览器所用语言,请求正文长度等。

    ⑶ 请求正文

    请求头结束之后有一个空行(空行表示请求头结束,请求正文开始)

  3. 返回数据:

    server端接收到client端的请求之后,开始响应client端,返回数据包。其中数据包包含如下信息

    ⑴ 协议状态版本代码描述

    ⑵ 响应头

    ⑶ 响应正文

    eg.

    

 1 HTTP/1.1 200 OK
 2 Server:Apache Tomcat/5.0.12
 3 Date:Mon,6Oct2003 13:23:42 GMT
 4 Content-Length:112
 5
 6 <html>
 7 <head>
 8 ...
 9 </body>
10 </html>

    ⑴  协议状态版本代码描述

    响应的第一行 “HTTP/1.1” 是协议版本, 200 OK 表示响应成功

    HTTP应答码也成状态码,反映了本次HTTP请求的状态,其中主要分为以下几种

    1XX -信息类,表示收到了请求进一步处理中

    2XX -成功类,表示用户的请求被正确接收正,理解,处理。例如200 OK

    3XX -重定向类,表示用户请求没有成功,客户端需要采取进一步动作

    4XX -客户端错误,表示客户端请求错误,其中404 NOT FOUNT 表示资源没有找到

    5XX -服务器端错误,表示服务器不能完成相对于的错误,一般是服务器内部错误。

    ⑵ 响应头

    与请求的类似

    ⑶ 响应正文

    响应头结束之后有一个空行,表示响应头结束,响应正文开始。

  4. 关闭连接:

    通过TCP四次握手断开连接。

    TCP 四次握手过程

    TCP是一个全双工的连接, 所以断开的时候需要两个方向分开断开, 原则:一个方向没有数据流动时候发送FIN包断开这个方向的连接。

    关闭原则 : 先关闭写通道,后关闭读通道

    【1】 客户端发送FIN来断开 客户端C和服务器方向的连接(关闭客户端向服务器的写通道)

    【2】 服务器端确认断开连接 向客户端发送确认消息(关闭客户端向服务器的读通道)

    【3】 服务器端发送FIN来断开 服务器和客户端方向的连接(关闭服务器的向写通道) 

    【4】 客户端确认断开连接,向服务器端确认(关闭服务器向客户端的读通道)

    

    CLOSE_WAIT:

    TCP的Close状态出现在被动关闭方(不一定是服务器),出现的时间在接收到主动关闭方的FIN而自身未发送 ACK, 如果出现大量的 close-wait需要检查服务器代码.

    TIME_WAIT:

    TCP关闭的主动方在接受到FIN之后再等待2MSL(windows大概240S)后再关闭 
    原因 
    【1】防止IP通信不稳定,如果直接Close, 如果服务器没有接收到客户端的Close-Wait,再次向客户端发送FIN, 此时客户端已经关闭,则返回的是RST,服务端会把这个错误交到高层。

    【2】防止原来的数据影响下次通讯, 如果主动方直接Close, 并且向服务器重新发送另外一个请求,虽然说端口不一定相同, 但是如果相同的话,原来的socket中滞留的数据,在建立连接之后发送到服

    务端,这样会造成数据混肴,所以TCP要等待 2MSL之后关闭连接。

    经过千锤百炼出来的各种协议,每一处设计都有它的巧妙的体现!!!!!!!!!!!!

转载于:https://www.cnblogs.com/zleiblogs/p/7127311.html

【HTTP请求】、详解相关推荐

  1. JavaEE基础(03):Http请求详解,握手挥手流程简介

    本文源码:GitHub·点这里 || GitEE·点这里 一.Http协议简介 1.概念说明 HTTP超文本传输协议,是用于从万维网服务器传输超文本到本地浏览器的传送协议,基于TCP/IP通信协议来传 ...

  2. java web流量阀值_Javaweb应用使用限流处理大量的并发请求详解

    在web应用中,同一时间有大量的客户端请求同时发送到服务器,例如抢购.秒杀等.这个时候如何避免将大量的请求同时发送到业务系统. 第一种方法:在容器中配置最大请求数,如果大于改请求数,则客户端阻塞.该方 ...

  3. fetch 请求详解

    转载:前后端数据交互(四)--fetch 请求详解 - 前端人 - 博客园 fetch 是 XMLHttpRequest 的升级版,使用js脚本发出网络请求,但是与 XMLHttpRequest 不同 ...

  4. linux 服务器拦截http请求,详解Linux屏蔽浏览器上http请求警报的方法

    众所周知,在Linux系统中浏览器的页面上是不允许出现http请求的,如果出现了http请求就会发生错误,并且Linux系统会向用户发出警报.下面,U大侠小编就给大家详解Linux屏蔽浏览器上http ...

  5. jQuery Ajax异步请求详解

    jQuery的Ajax API是对XMLHttpRequest对象的抽象,解决了浏览器之间的兼容性问题,同时提供了一些方便的方法.这篇博客的撰写参考了jQuery官网,jQuery Ajax API ...

  6. 宜家IKEA EDI IFTMBF运输预定请求详解

    IFTMBF是宜家与其供应商之间传输的符合EDIFACT标准的报文,在此前的文章如何读懂EDIFACT报文中,我们已经对EDIFACT做了详细的解读.IFTMBF运输预定请求一般由供应商发给宜家,在宜 ...

  7. Servlet生命周期与Web容器架构及处理请求详解

    一.Servlet对象 Servlet对象运行在Servlet容器中,Servlet的生命周期由容器管理(Servlet容器的基本思想是在服务器端使用Java来动态生成网页). (一)Servlet对 ...

  8. Jmeter之HTTP请求详解

    一. HTTP request详解 客户端发送的HTTP请求到Web服务器时,请求消息主要包含: 请求行 请求头 请求体(请求报文/请求参数) 1.1 请求行 请求行用于说明请求类型,以及要访问的资源 ...

  9. php curlget方法_PHP cURL请求详解

    在PHP后端的开发过程中,除了获取数据库的数据和处理数据的内部逻辑,往往还需要请求其他服务器接口的数据,我们一般有3种方式来获取数据,分别是: file_get_contents fsockopen ...

  10. Android 网络请求详解

    我们知道大多数的 Android 应用程序都是通过和服务器进行交互来获取数据的.如果使用 HTTP 协议来发送和接收网络数据,就免不了使用 HttpURLConnection 和 HttpClient ...

最新文章

  1. Java同一个类的不同实例_如何创建2个类实例注入不同类的依赖项实现(通过guice)?...
  2. 姚殊清华计算机科学与技术,王道顺(清华大学计算机科学与技术系副教授)_百度百科...
  3. 敏捷开发原则与实践(二)
  4. mode: 'history', 去掉路由地址的#
  5. Android应用中使用AsyncHttpClient来异步网络数据
  6. 在虚拟机下体验ubuntu(有奔头)
  7. Java8-Stream-终止操作-查找与匹配
  8. 【Redis】Redis 五大基本数据类型
  9. HDU2109 Fighting for HDU【排序】
  10. Java进阶3. 内存回收机制
  11. 在ASP.NET的复合组件中实现冒泡处理机制
  12. Linux c学习--进程基础学习
  13. BIN文件和HEX文件区别
  14. python背单词代码实现
  15. 计算机网络在化学中的应用论文,计算机在化学中应用
  16. 排序算法的代码--选择排序综合训练题
  17. 沟通的艺术:简介及内容导航
  18. 分析浊音、清音爆破音的时域及频域特性
  19. 三天学会网络爬虫之Day03
  20. 小目标---时钟的实现

热门文章

  1. Jsp 【项目路径】
  2. PacketFence ZEN 4.0.1 发布,网络接入控制
  3. PHP面试题及答案(一)
  4. 【转】Request.Form.Get() Request.Form Request[]区别
  5. Flex 4 的ComboBox下拉框滚动条Scroller(VerticalScrollBar)的thumb过小问题的解决
  6. 二次元始,跌宕几年,至学术略有成就并步入业界的我与NLP的这七年时光!
  7. 100%抄袭!ICLR 2022投稿论文剽窃两篇顶会,程序主席放「实锤」严词拒稿!
  8. 【GNN】R-GCN:GCN 在知识图谱中的应用
  9. 【基础】如何理解LSTM后接CRF?
  10. 新网银行杯数据科学竞赛复赛第八名总结