一、协议介绍

  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,deflate username=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.

    

 HTTP/1.1 200 OK
Server:Apache Tomcat/5.0.12
Date:Mon,6Oct2003 13:23:42 GMT
Content-Length:112 <html>
<head>
...
</body>
</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之后关闭连接。

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

【HTTP请求】、详解的更多相关文章

  1. AJAX请求详解 同步异步 GET和POST

    AJAX请求详解 同步异步 GET和POST 上一篇博文(http://www.cnblogs.com/mengdd/p/4191941.html)介绍了AJAX的概念和基本使用,附有一个小例子,下面 ...

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

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

  3. 【Java_Spring】RestTemplate发HTTP请求详解

    Springboot — 用更优雅的方式发HTTP请求(RestTemplate详解) Spring RestTemplate提交时设置http header请求头 Spring之RestTempla ...

  4. GET请求与POST请求详解

    一.GET请求 常用于获取服务器数据.常见的发起GET请求的方式有:url.href.src.form. 二.GET请求的格式 例子:index.php?userName=harry&pass ...

  5. 前后端数据交互(四)——fetch 请求详解

    fetch 是 XMLHttpRequest 的升级版,使用js脚本发出网络请求,但是与 XMLHttpRequest 不同的是,fetch 方式使用 Promise,相比 XMLHttpReques ...

  6. HttpClient请求详解

    HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建 ...

  7. http 请求详解大全

    HTTP 100 Continue继续 101 Switching Protocols切换协议 200 OK正常 201 Created已创建 202 Accepted已接受 203 Non-Auth ...

  8. http请求详解

    GET GET方法意思是获取被请求URI(Request-URI)指定的信息(以实体的格式).如果请求URI涉及到一个数据生成过程,那么这个过程生成的数据应该被作为实体在响应中返回而不是过程的源文本, ...

  9. jquery ajax跨域请求详解

    本文章来给大家详细jquery中的ajax跨域请求, 在JQuery对于Ajax的跨域请求有两类解决方案,不过都是只支持get方式.分别是JQuery的jquery.ajax jsonp格式和jque ...

  10. AJAX请求和跨域请求详解(原生JS、Jquery)

    一.概述 AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. AJAX = 异步 JavaScript 和 XML,是一种用于创建快速动态网页的技术.通过在后台与服务器进行少量数 ...

随机推荐

  1. JQuery中绑定事件(bind())和移除事件(unbind())

    有时候事件执行完了,想取消事件的效果可以通过一定的办法来处理.比如bind()(绑定事件)和unbind()(移除通过bind()方法添加的事件)方法来移除事件的效果. 比如下面的一个案例: 复制代码 ...

  2. bzoj2843&&1180

    题解: lct 和上一题差不多 这一题还要判断是否有链接 其实直接并查集判断就可以了 代码: #pragma GCC optimize(2) #include<bits/stdc++.h> ...

  3. Life Cycle(JSF+Facelets)

    一.JSF Life Cycle: 图1 图2 应用程序的生命周期是指应用程序的各个阶段,从开始到结束.所有应用程序的生命周期.在web应用程序生命周期中,执行常见任务,包括以下内容.■处理传入的请求 ...

  4. MyEclipse web jsp 如何调试

    MyEclipse如何调试 | 浏览:882 | 更新:2014-03-13 17:38 1 2 3 4 5 分步阅读 当程序写好之后,如何调试呢? 我们在MyEclipse中jav添加断点,运行de ...

  5. Linux 网络编程->epoll<-LT/ET模式整理(~相逢何必曾相识~)

    今天自己整理一下epoll,网上有很多经典的介绍,看了很多~收藏了很多~还是整理一下做个积累, 自己的东西好找~ 1. epoll 模型简介 epoll 是Linux I/O 多路复用接口 selec ...

  6. SendMessage wMsg常量值参考

    namespace Core.WinAPI { /// <summary> /// wMsg参数常量值: /// </summary> public static class ...

  7. spring注解事务使用总结

    在使用spring的注解事务的时候,需要考虑到事务的传播行为.遇到什么类型的异常时,事务才起作用.事务方法之间的嵌套调用时,怎么样才生效等等诸多问题.网上搜到很多的主要还是一堆理论文字描述,我这里给出 ...

  8. html模拟组织架构横向展开

    近期看到不少人有相似的需求.实现组织架构的横向展开,显示.无聊就做了一下.先看下终于的效果图 兼容各大主流浏览器,而且支持IE6.7,8,不同的是排除标签圆角效果外,资源文件:文件下载地址 主流浏览器 ...

  9. 不以main为入口的函数

    先看一段程序 #include <stdio.h> void test() { printf("Hello Word!\n"); return 0; } 没有main函 ...

  10. LogHelp 日记分天记录,只记30天日记

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Tex ...