HTTP协议详解

1.1 HTTP协议简介

我们日常生活中经常会使用浏览器访问Web站点,但是大家有思考过在这个过程中到底发生了什么吗?为什么我们在浏览器地址栏上面输入要访问的URL后就可以访问到Web页面呢?

1.1.1 浏览器背后的故事

当我们在浏览器地址栏上输入要访问的URL后,浏览器会分析出URL上面的域名,然后通过DNS服务器查询出域名映射的IP地址,浏览器根据查询到的IP地址与Web服务器进行通信,而通信的协议就是HTTP协议。

我们可以把这个过程类比成一个电话对话的过程。当我们要打电话给某个人,首先要知道对方的电话号码,然后进行拨号。打通电话后我们会进行对话,当然要对话肯定需要共同的语言,如果一个人说国语,而另一个人说英语,那肯定不能进行沟通的。在本例中,电话号码相当于上面的IP地址,而共同语言相当于HTTP协议。

我们通过一个简单的图来阐述这个过程:


 图1-1 浏览器访问URL过程

 浏览器与Web服务器使用HTTP协议进行通信,那么什么是HTTP协议呢?接下来我们会详细介绍HTTP协议的相关知识。

1.1.2 TCP/IP协议

HTTP协议是构建在TCP/IP协议之上的,是TCP/IP协议的一个子集,所以要理解HTTP协议,有必要先了解下TCP/IP协议相关的知识。

由于TCP/IP协议族包含众多的协议,在这里我们无法一一讨论。接下来,我们仅介绍理解HTTP协议需要掌握的TCP/IP协议族的一些相关知识点。如果想深入理解TCP/IP协议,可以参考经典书籍《TCP/IP详解》。

TCP/IP协议族分层

TCP/IP协议族是由一个四层协议组成的系统,这四层分别为:应用层、传输层、网络层和数据链路层。如图1-2所示:


图1-2 TCP/IP协议族分层

 分层的好处是把各个相对独立的功能解耦,层与层之间通过规定好的接口来通信。如果以后需要修改或者重写某一个层的实现,只要接口保持不变也不会影响到其他层的功能。接下来,我们将会介绍各个层的主要作用。

1) 应用层

应用层一般是我们编写的应用程序,其决定了向用户提供的应用服务。应用层可以通过系统调用与传输层进行通信。

处于应用层的协议非常多,比如:FTP(File Transfer Protocol,文件传输协议)、DNS(Domain Name System,域名系统)和我们本章讨论的HTTP(HyperText Transfer Protocol,超文本传输协议)等。

2) 传输层

传输层通过系统调用向应用层提供处于网络连接中的两台计算机之间的数据传输功能。

在传输层有两个性质不同的协议:TCP(Transmission Control Protocol,传输控制协议)和UDP(User Data Protocol,用户数据报协议)。

3) 网络层

网络层用来处理在网络上流动的数据包,数据包是网络传输的最小数据单位。该层规定了通过怎样的路径(传输路线)到达对方计算机,并把数据包传输给对方。

4) 链路层

链路层用来处理连接网络的硬件部分,包括控制操作系统、硬件设备驱动、NIC(Network Interface Card,网络适配器)以及光纤等物理可见部分。硬件上的范畴均在链路层的作用范围之内。

数据包封装

上层协议数据是如何转变为下层协议数据的呢?这是通过封装(encapsulate)来实现的。应用程序数据在发送到物理网络之前,会沿着协议栈从上往下传递。每层协议都将在上层协议数据的基础上加上自己的头部信息(链路层还会加上尾部信息),以为实现该层功能提供必要的信息。如图1-3所示:

图1-3 数据包封装

发送端发送数据时,数据会从上层传输到下层,且每经过一层都会被打上该层的头部信息。而接收端接收数据时,数据会从下层传输到上层,传输前会把下层的头部信息删除。过程如图1-4所示:


图1-4 数据传输过程

由于下层协议的头部信息对上层协议是没有实际的用途,所以在下层协议传输数据给上层协议的时候会把该层的头部信息去掉,这个封装过程对于上层协议来说是完全透明的。这样做的好处是,应用层只需要关心应用服务的实现,而不用管底层的实现。

TCP三次握手

从上面的介绍可知,传输层协议主要有两个:TCP协议和UDP协议。TCP协议相对于UDP协议的特点是:TCP协议提供面向连接、字节流和可靠的传输。

使用TCP协议进行通信的双方必须先建立连接,然后才能开始传输数据。TCP连接是全双工的,也就是说双方的数据读写可以通过一个连接进行。为了确保连接双方可靠性,在双方建立连接时,TCP协议采用了三次握手(Three-way handshaking)策略。过程如图1-5:


图1-5 TCP三次握手

    TCP协议三次握手的描述如下:

第一次握手:客户端发送带有SYN标志的连接请求报文段,然后进入SYN_SEND状态,等待服务端的确认。

第二次握手:服务端接收到客户端的SYN报文段后,需要发送ACK信息对这个SYN报文段进行确认。同时,还要发送自己的SYN请求信息。服务端会将上述的信息放到一个报文段(SYN+ACK报文段)中,一并发送给客户端,此时服务端将会进入SYN_RECV状态。

第三次握手:客户端接收到服务端的SYN+ACK报文段后,会想服务端发送ACK确认报文段,这个报文段发送完毕后,客户端和服务端都进入ESTABLISHED状态,完成TCP三次握手。

 

当三次握手完成后,TCP协议会为连接双方维持连接状态。为了保证数据传输成功,接收端在接收到数据包后必须发送ACK报文作为确认。如果在指定的时间内(这个时间称为重新发送超时时间),发送端没有接收到接收端的ACK报文,那么就会重发超时的数据。

1.1.3 DNS服务

前面介绍了与HTTP协议有着密切关系的TCP/IP协议,接下来介绍的DNS服务也是与HTTP协议有着密不可分的关系。

通常我们访问一个网站,使用的是主机名或者域名来进行访问的。因为相对于IP地址(一组纯数字),域名更容易让人记住。但TCP/IP协议使用的是IP地址进行访问的,所以必须有个机制或服务把域名转换成IP地址。DNS服务就是用来解决这个问题的,它提供域名到IP地址之间的解析服务。

图1-6展示了DNS服务把域名解析成IP地址的过程:

  
图1-6 DNS服务原理

DNS服务是通过DNS协议进行通信的,而DNS协议跟HTTP协议一样也是应用层协议。由于我们的重点是HTTP协议,所以这里不打算对DNS协议进行详细的分析,我们只需要知道可以通过DNS服务把域名解析成IP地址即可。

1.1.4 HTTP与TCP/IP、DNS的关系

    到现在,我们介绍了与HTTP协议有密切关系的TCP/IP协议和DNS服务,接下来我们通过图1-7来整理一下HTTP协议与它们之间的关系:


 图1-7 HTTP与TCP/IP、DNS的关系

从图1-7可以知道,当客户端访问Web站点时,首先会通过DNS服务查询到域名的IP地址。然后浏览器生成HTTP请求,并通过TCP/IP协议发送给Web服务器。Web服务器接收到请求后会根据请求生成响应内容,并通过TCP/IP协议返回给客户端。

    <div id="dmp_ad_58"><div id="kp_box_58" data-pid="58" data-track-click="{&quot;mod&quot;:&quot;kp_popu_58-386&quot;,&quot;con&quot;:&quot;,,&quot;}"><div style="width:100%;background:#fff;">
<div class="comment-edit-box d-flex">
	<a id="commentsedit"></a>
	<div class="user-img">
		<a href="//me.csdn.net/weixin_40979567" target="_blank">
			<img class="" src="https://avatar.csdn.net/1/A/6/3_weixin_40979567.jpg">
		</a>
	</div>
	<form id="commentform">
		<input type="hidden" id="comment_replyId">
		<textarea class="comment-content" name="comment_content" id="comment_content" placeholder="想对作者说点什么"></textarea>
		<div class="opt-box"> <!-- d-flex -->
			<div id="ubbtools" class="add_code">
				<a href="#insertcode" code="code" target="_self"><i class="icon iconfont icon-daima"></i></a>
			</div>
			<input type="hidden" id="comment_replyId" name="comment_replyId">
			<input type="hidden" id="article_id" name="article_id" value="81088317">
			<input type="hidden" id="comment_userId" name="comment_userId" value="">
			<input type="hidden" id="commentId" name="commentId" value="">
			<div style="display: none;" class="csdn-tracking-statistics tracking-click" data-mod="popu_384"><a href="#" target="_blank" class="comment_area_btn">发表评论</a></div>
			<div class="dropdown" id="myDrap">
				<a class="dropdown-face d-flex align-items-center" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
				<div class="txt-selected text-truncate">添加代码片</div>
				<svg class="icon d-block" aria-hidden="true">
					<use xlink:href="#csdnc-triangledown"></use>
				</svg>
				</a>
				<ul class="dropdown-menu" id="commentCode" aria-labelledby="drop4">
					<li><a data-code="html">HTML/XML</a></li>
					<li><a data-code="objc">objective-c</a></li>
					<li><a data-code="ruby">Ruby</a></li>
					<li><a data-code="php">PHP</a></li>
					<li><a data-code="csharp">C</a></li>
					<li><a data-code="cpp">C++</a></li>
					<li><a data-code="javascript">JavaScript</a></li>
					<li><a data-code="python">Python</a></li>
					<li><a data-code="java">Java</a></li>
					<li><a data-code="css">CSS</a></li>
					<li><a data-code="sql">SQL</a></li>
					<li><a data-code="plain">其它</a></li>
				</ul>
			</div>  
			<div class="right-box">
				<span id="tip_comment" class="tip">还能输入<em>1000</em>个字符</span>
				<input type="button" class="btn btn-sm btn-cancel d-none" value="取消回复">
				<input type="submit" class="btn btn-sm btn-red btn-comment" value="发表评论">
			</div>
		</div>
	</form>
</div>

	<div class="comment-list-container">
	<a id="comments"></a>
	<div class="comment-list-box">
	</div>
	<div id="commentPage" class="pagination-box d-none"></div>
	
</div>
<div class="recommend-item-box recommend-ad-box"><div id="kp_box_59" data-pid="59" data-track-click="{&quot;mod&quot;:&quot;kp_popu_59-78&quot;,&quot;con&quot;:&quot;,,&quot;}"><script type="text/javascript">
(function() {
    var s = "_" + Math.random().toString(36).slice(2);
    document.write('<div style="" id="' + s + '"></div>');
    (window.slotbydup = window.slotbydup || []).push({
        id: "u3491668",
        container:  s
    });
})();

HTTP协议详解(真的很经典)- - tester_wu的博客 - CSDN博客

11-23

Http通信协议 - 小菜鸟的blog - CSDN博客

5-19

<div class="recommend-item-box recommend-ad-box"><div id="kp_box_60" data-pid="60" data-track-view="{&quot;mod&quot;:&quot;kp_popu_60-894&quot;,&quot;con&quot;:&quot;426419954437317597,,&quot;}" data-track-click="{&quot;mod&quot;:&quot;kp_popu_60-894&quot;,&quot;con&quot;:&quot;426419954437317597,,&quot;}"><link rel="stylesheet" href="https://www.csdn.net/company/css/edu-recommend-1.0.1.css">
使用Jmeter进行接口测试

n 学院 讲师: n

html简述 - liujiujiang的博客 - CSDN博客

10-16

1:HTML整体结构 //它是指示 web 浏览器关于页面使用哪个 HTML 版本进行编写的指令,必须是 HTML 文档的第一行,位于 标签之前(声明) //此元素可告知浏览器其...

http协议详解及操作 - 宇弦 - CSDN博客

4-16

互联网,绝大多数的Web开发,都是构建在HTTP协议之上的Web应用,核心就是不同构建...博文 来自: liujiujiang的博客 HTTP协议详解.pdf 11-18 HTTP协议详解 HTTP...

		<div class="recommend-item-box blog-expert-recommend-box" style="">
		<div class="d-flex">
			<div class="blog-expert-recommend">
				<div class="blog-expert">
					<div class="blog-expert-flexbox"></div>
				</div>
			</div>
		</div>
	</div><div class="recommend-item-box baiduSearch recommend-box-ident" data-track-view="{&quot;mod&quot;:&quot;popu_614&quot;,&quot;con&quot;:&quot;,https://blog.csdn.net/aliujiujiang/article/details/83623587,searchFromBaidu1_4,-&quot;}" data-track-click="{&quot;mod&quot;:&quot;popu_614&quot;,&quot;con&quot;:&quot;,https://blog.csdn.net/aliujiujiang/article/details/83623587,searchFromBaidu1_4,-&quot;}" data-flg="true">                <a href="https://blog.csdn.net/aliujiujiang/article/details/83623587" target="_blank">              		<h4 class="text-truncate oneline" style="width: 872.313px;">axios 和ajax - liujiujiang的博客 - CSDN博客</h4>                  <div class="info-box d-flex align-content-center">                    <p>                      <span class="date">5-17</span>                    </p>                  </div>              		<p class="content oneline" style="width: 962px;">https://blog.csdn.net/aliujiujiang/article/...(JSHTTP库/Ajax库) 博文 来自: kasmine的博客 ...SNMP协议详解&lt;二&gt;  10-29 阅读数 15万+  上一篇...</p>                </a>            	</div><div class="recommend-item-box baiduSearch recommend-box-ident" data-track-view="{&quot;mod&quot;:&quot;popu_614&quot;,&quot;con&quot;:&quot;,https://blog.csdn.net/aliujiujiang/article/details/85129878,searchFromBaidu1_5,-&quot;}" data-track-click="{&quot;mod&quot;:&quot;popu_614&quot;,&quot;con&quot;:&quot;,https://blog.csdn.net/aliujiujiang/article/details/85129878,searchFromBaidu1_5,-&quot;}" data-flg="true">                <a href="https://blog.csdn.net/aliujiujiang/article/details/85129878" target="_blank">              		<h4 class="text-truncate oneline" style="width: 864.101px;">包管理工具——Yarn - liujiujiang的博客 - CSDN博客</h4>                  <div class="info-box d-flex align-content-center">                    <p>                      <span class="date">12-22</span>                    </p>                  </div>              		<p class="content oneline" style="width: 962px;">https://blog.csdn.net/aliujiujiang/article/...yarn config set sass_binary_site http://cdn.npm...来自: 老妖儿的博客 ...</p>                </a>            	</div>
vue中的:作用 - liujiujiang的博客 - CSDN博客

2-17

https://blog.csdn.net/aliujiujiang/article/...本文出自:http://blog.csdn.net/wyk304443164看了Vue...博文 来自: 山楂树男孩的博客专栏 vue-cli新建一...

对网络应用层的理解(一) - shenmill的博客 - CSDN博客

4-10

HTTP协议详解 07-17 阅读数 1054 1.1HTTP协议简介我们日常生活中经常会使用...博文 来自: liujiujiang的博客 计算机网络 自顶向下方法 第二章 应用层 07...

<div class="recommend-item-box recommend-ad-box"><div id="_p12lzavi2fg" style=""><iframe width="852" frameborder="0" height="60" scrolling="no" src="//pos.baidu.com/s?hei=60&amp;wid=852&amp;di=u3491668&amp;ltu=https%3A%2F%2Fblog.csdn.net%2Faliujiujiang%2Farticle%2Fdetails%2F81088317&amp;psi=7c267957d1fd332a9741dc9765b71115&amp;cmi=4&amp;cce=true&amp;ps=7074x422&amp;cja=false&amp;drs=1&amp;tlm=1561716819&amp;dai=3&amp;dtm=HTML_POST&amp;dis=0&amp;cdo=-1&amp;prot=2&amp;pis=-1x-1&amp;ant=0&amp;cpl=3&amp;dri=1&amp;cec=UTF-8&amp;pcs=1499x730&amp;ti=HTTP%E5%8D%8F%E8%AE%AE%E8%AF%A6%E8%A7%A3%20-%20liujiujiang%E7%9A%84%E5%8D%9A%E5%AE%A2%20-%20CSDN%E5%8D%9A%E5%AE%A2&amp;cfv=0&amp;psr=1366x768&amp;ari=2&amp;dc=3&amp;pss=1498x8494&amp;tcn=1561716819&amp;col=zh-CN&amp;tpr=1561716819392&amp;par=1366x728&amp;ccd=24&amp;exps=111000,110011&amp;chi=2"></iframe><ins class="rkdvbzrtgw" style="width:0px;height:0px;"></ins></div><script type="text/javascript" src="//rabc1.iteye.com/production/res/rxjg.js?pkcgstj=jm"></script></div>
<div class="recommend-item-box recommend-ad-box"><div id="kp_box_62" data-pid="62" data-track-view="{&quot;mod&quot;:&quot;kp_popu_62-1062&quot;,&quot;con&quot;:&quot;,,&quot;}" data-track-click="{&quot;mod&quot;:&quot;kp_popu_62-1062&quot;,&quot;con&quot;:&quot;,,&quot;}"><iframe src="https://kunpeng-sc.csdnimg.cn/#/preview/237?positionId=62&amp;queryWord=" frameborder="0" width="100%" height="75px" scrolling="no"></iframe></div></div>
<div class="recommend-item-box recommend-ad-box"><div id="kp_box_63" data-pid="63" data-track-view="{&quot;mod&quot;:&quot;kp_popu_63-1059&quot;,&quot;con&quot;:&quot;,,&quot;}" data-track-click="{&quot;mod&quot;:&quot;kp_popu_63-1059&quot;,&quot;con&quot;:&quot;,,&quot;}"><iframe src="https://kunpeng-sc.csdnimg.cn/#/preview/234?positionId=63&amp;queryWord=" frameborder="0" width="100%" height="75px" scrolling="no"></iframe></div></div>
<div class="recommend-item-box recommend-ad-box"><div id="kp_box_64" data-pid="64" data-track-view="{&quot;mod&quot;:&quot;kp_popu_64-1251&quot;,&quot;con&quot;:&quot;,,&quot;}" data-track-click="{&quot;mod&quot;:&quot;kp_popu_64-1251&quot;,&quot;con&quot;:&quot;,,&quot;}"><!-- T28 位置 -->
<div class="recommend-item-box recommend-ad-box"><div id="kp_box_65" data-pid="65" data-track-view="{&quot;mod&quot;:&quot;kp_popu_65-1252&quot;,&quot;con&quot;:&quot;,,&quot;}" data-track-click="{&quot;mod&quot;:&quot;kp_popu_65-1252&quot;,&quot;con&quot;:&quot;,,&quot;}"><!-- T33 位置 -->
<div class="recommend-item-box recommend-ad-box"><div id="kp_box_66" data-pid="66" data-track-view="{&quot;mod&quot;:&quot;kp_popu_66-881&quot;,&quot;con&quot;:&quot;,,&quot;}" data-track-click="{&quot;mod&quot;:&quot;kp_popu_66-881&quot;,&quot;con&quot;:&quot;,,&quot;}"><script src="https://nbrecsys.4paradigm.com/resource/cus/csdn/sdk-csdn-render.js"></script>
<div class="recommend-item-box  recommend-download-box clearfix" data-track-click="{&quot;mod&quot;:&quot;popu_614&quot;,&quot;con&quot;:&quot;,https://download.csdn.net/download/weixin_38669628/10988745,BlogCommendFromBaidu_38&quot;}" data-flg="true">
	<a href="https://download.csdn.net/download/weixin_38669628/10988745" target="_blank">
		<div class="content clearfix">
			<div class="">
				<h4 class="text-truncate oneline clearfix">
					<em>Http</em>协议中文版					</h4>
				<span class="data float-right">03-01</span>
			</div>
			<div class="desc oneline">
					NULL 博文链接:https://gurudk.iteye.com/blog/283736				</div>
			<span class="type-show type-show-download">下载</span>
		</div>
	</a>
</div>
<div class="recommend-item-box recommend-ad-box"><div id="kp_box_67" data-pid="67" data-track-view="{&quot;mod&quot;:&quot;kp_popu_67-882&quot;,&quot;con&quot;:&quot;,,&quot;}" data-track-click="{&quot;mod&quot;:&quot;kp_popu_67-882&quot;,&quot;con&quot;:&quot;,,&quot;}"><script src="https://nbrecsys.4paradigm.com/resource/cus/csdn/sdk-csdn-render.js"></script>
<div class="recommend-item-box recommend-ad-box"><div id="kp_box_68" data-pid="68" data-track-view="{&quot;mod&quot;:&quot;kp_popu_68-883&quot;,&quot;con&quot;:&quot;,,&quot;}" data-track-click="{&quot;mod&quot;:&quot;kp_popu_68-883&quot;,&quot;con&quot;:&quot;,,&quot;}"><!-- T48 位置 -->
人脸检测工具face_recognition的安装与应用

08-11 阅读数 9万+

人脸检测工具face_recognition的安装与应用 博文 来自: roguesir的博客

环信(Android)设置头像和昵称的方法(最简单暴力的基于环信demo的集成)。

06-28 阅读数 1248

http://blog.csdn.net/zqbemail10/article/details/51659128 博文 来自: 力学不知疲

mybatis一级缓存(session cache)引发的问题

05-14 阅读数 5万+

mybatis一级缓存(session cache)引发的问题 博文 来自: flysharkym的专栏

            <div class="recommend-item-box type_hot_word">
                            <div class="content clearfix" style="width: 962px;">
                <div class="word float-left">
                                                        <span>
                    <a href="https://edu.csdn.net/courses/o5329_s5330_k " target="_blank">
                    机器学习教程                    </a></span>
                                                                            <span>
                    <a href="https://edu.csdn.net/courses/o280_s351_k " target="_blank">
                    Objective-C培训                    </a></span>
                                                                            <span>
                    <a href="https://edu.csdn.net/combos/o7115_s388_l0_t " target="_blank">
                    交互设计视频教程                    </a></span>
                                                                            <span>
                    <a href="https://edu.csdn.net/course/play/5599/104252 " target="_blank">
                    颜色模型                    </a></span>
                                                                            <span>
                    <a href="https://edu.csdn.net/combos/o363_l0_t " target="_blank">
                    设计制作学习                    </a></span>
                                                        </div>
            </div>
                                            <div class="content clearfix" style="width: 962px;">
                <div class="float-left">
                                    <span>
                    <a href="https://www.csdn.net/gather_24/MtTaEg3sMDM5MS1ibG9n.html" target="_blank">
                    mysql关联查询两次本表</a>
                </span>
                                    <span>
                    <a href="https://www.csdn.net/gather_10/MtjaIg3sMTUzMy1kb3dubG9hZAO0O0OO0O0O.html" target="_blank">
                    native底部 react</a>
                </span>
                                    <span>
                    <a href="https://www.csdn.net/gather_1b/Ntzagg1sOTU3LWRvd25sb2Fk.html" target="_blank">
                    extjs glyph 图标</a>
                </span>
                                    <span>
                    <a href="https://www.csdn.net/gather_4a/NtzaIgxsMTgtZWR1.html" target="_blank">
                    java的http学习</a>
                </span>
                                    <span>
                    <a href="https://www.csdn.net/gather_4a/NtzacgzsOTMtZWR1.html" target="_blank">
                    http学习 java</a>
                </span>
                                    </div>
            </div>
                            </div>
                        <div class="recommend-loading-box">
            <img src="https://csdnimg.cn/release/phoenix/images/feedLoading.gif">
        </div>
        <div class="recommend-end-box">
            <p class="text-center">没有更多推荐了,<a href="https://blog.csdn.net/" class="c-blue c-blue-hover c-blue-focus">返回首页</a></p>
        </div>
    </div>
</main>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值