读完需要40分钟左右
状态码 | 描述 |
---|---|
100-199 |
成功接收请求, 要求客户端继续提交下一次请求才能完成整个处理过程 |
200-299 |
成功接收请求并已完成整个处理过程,常用200 |
300-399 |
为完成请求, 需进一步细化需求: 例如: 请求的资源已经移动一个新地址,常用302(重定向),307 和304(拿缓存) |
400-499 |
客户端的请求有错误, 包含语法错误或者不能正确执行。 常用404(请求的资源在web服务器中没有),403(服务器拒绝访问, 权限不够) |
500-599 |
服务器端出现错误 |
200 |
表示一切正常, 返回的是正常请求结果 |
302/307 |
临时重定向,指出请求的文档已被临时移动到别处, 此文档的新的url在location响应头中给出 |
304 |
未修改,表示客户端缓存的版本是最新的, 客户端应该继续使用它 |
403 |
禁止,服务器理解客户端请求,但拒绝处理它,通常用于服务器上文件或目录的权限设置所致 |
404 |
找不到,服务器上不存在客户端所请求的资源 |
500 |
服务器内部错误,服务器端的cgi,asp,jsp等程序发生错误 |
应用层(application-layer)
的任务是通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程(进程:主机中正在运行的程序)间的通信和交互的规则。对于不同的网络应用需要不同的应用层协议。在互联网中应用层协议很多,如域名系统 DNS
,支持万维网应用的 HTTP 协议
,支持电子邮件的 SMTP 协议
等等。我们把应用层交互的数据单元称为报文。
域名系统(Domain Name System
缩写DNS
,Domain Name被译为域名)是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。
超文本传输协议(HTTP,HyperText Transfer Protocol)
是互联网上应用最为广泛的一种网络协议。所有的WWW(万维网)
文件都必须遵守这个标准。
运输层(transport layer)
的主要任务就是负责向两台主机进程之间的通信提供通用的数据传输服务。应用进程利用该服务传送应用层报文。“通用的”是指并不针对某一个特定的网络应用,而是多种应用可以使用同一个运输层服务。由于一台主机可同时运行多个线程,因此运输层有复用和分用的功能。所谓复用就是指多个应用层进程可同时使用下面运输层的服务,分用和复用相反,是运输层把收到的信息分别交付上面应用层中的相应进程。
传输控制协议TCP
(Transmisson Control Protocol
)–提供面向连接的,可靠的数据传输服务。
用户数据协议UDP
(User Datagram Protocol
)–提供无连接的,尽最大努力的数据传输服务(不保证数据传输的可靠性)。
TCP
的主要特点
1、TCP
是面向连接的。(就好像打电话一样,通话前需要先拨号建立连接,通话结束后要挂机释放连接);
2、每一条TCP
连接只能有两个端点,每一条TCP
连接只能是点对点
的(一对一);
3、TCP
提供可靠交付的服务。通过TCP
连接传送的数据,无差错、不丢失、不重复、并且按序到达;
4、TCP
提供全双工通信。TCP
允许通信双方的应用进程在任何时候都能发送数据。TCP
连接的两端都设有发送缓存和接收缓存,用来临时存放双方通信的数据;
5、面向字节流。TCP
中的“流”(Stream
)指的是流入进程或从进程流出的字节序列。“面向字节流”的含义是:虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序接下来的数据仅仅看成是一连串的无结构的字节流。
1、UDP是无连接的;
2、UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态(这里面有许多参数);
3、UDP是面向报文的;
4、UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如直播,实时视频会议等);
5、UDP支持一对一、一对多、多对一和多对多的交互通信;
6、UDP的首部开销小,只有8个字节,比TCP的20个字节的首部要短。
在计算机网络中进行通信的两个计算机之间可能会经过很多个数据链路,也可能还要经过很多通信子网。网络层的任务就是选择合适的网间路由和交换结点, 确保数据及时传送。在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组和包进行传送。在TCP/IP
体系结构中,由于网络层使用IP协议,因此分组也叫IP数据报 ,简称数据报。
互联网是由大量的异构(heterogeneous)网络
通过路由器(router)
相互连接起来的。互联网使用的网络层协议是无连接的网际协议(Intert Prococol)和许多路由选择协议,因此互联网的网络层也叫做网际层或IP层。
数据链路层(data link layer)
通常简称为链路层。两台主机之间的数据传输,总是在一段一段的链路上传送的,这就需要使用专门的链路层的协议。 在两个相邻节点之间传送数据时,数据链路层将网络层接下来的IP数据报组装成帧,在两个相邻节点间的链路上传送帧。每一帧包括数据和必要的控制信息(如同步信息,地址信息,差错控制等)。
在接收数据时,控制信息使接收端能够知道一个帧从哪个比特开始和到哪个比特结束。这样,数据链路层在收到一个帧后,就可从中提取数据部分,上交给网络层。控制信息还使接收端能够检测到所收到的帧中有无差错。如果发现差错,数据链路层就简单地丢弃这个出了差错的帧,以避免继续在网络中传送下去,浪费网络资源。如果需要改正数据在链路层传输时出现差错(这就是说,数据链路层不仅要检错,而且还要纠错),那么就要采用可靠性传输协议来纠正出现的差错。这种方法会使链路层的协议复杂些。
在物理层上所传送的数据单位是比特。 物理层(physical layer)
的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异。使其上面的数据链路层不必考虑网络的具体传输介质是什么。“透明传送比特流”表示经实际电路传送后的比特流没有发生变化,对传送的比特流来说,这个电路好像是看不见的。
在互联网使用的各种协中最重要和最著名的就是TCP/IP
两个协议。
HTTP
协议运行在TCP
之上,明文传输,客户端与服务器端都无法验证对方的身份;HTTPS
是身披SSL(Secure Socket Layer)
外壳的HTTP
,运行于SSL
上,SSL
运行于TCP
之上,是添加了加密和认证机制的HTTP
。二者之间存在如下不同:
1、端口不同:HTTPS
与HTTP
使用不同的连接方式,用的端口也不一样,前者是80
,后者是443
;
2、资源消耗:和HTTP
通信相比,HTTPS
通信会由于加减密处理消耗更多的CPU
和内存资源;
3、开销:HTTPS
通信需要证书,而证书一般需要向认证机构购买;
4、HTTPS
的加密机制是一种共享密钥加密和公开密钥加密并用的混合加密机制。
对称密钥加密是指加密和解密使用同一个密钥的方式,这种方式存在的最大问题就是密钥发送问题,即如何安全地将密钥发给对方;而非对称加密是指使用一对非对称密钥,即公钥和私钥,公钥可以随意发布,但私钥只有自己知道。发送密文的一方使用对方的公钥进行加密处理,对方接收到加密信息后,使用自己的私钥进行解密。
由于非对称加密的方式不需要发送用来解密的私钥,所以可以保证安全性;但是和对称加密比起来,它非常的慢,所以我们还是要用对称加密来传送消息,但对称加密所使用的密钥我们可以通过非对称加密的方式发送出去。
TCP
提供一种面向连接的、可靠的字节流服务。其中,面向连接意味着两个使用TCP
的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个TCP
连接。在一个TCP
连接中,仅有两方进行彼此通信;而字节流服务意味着两个应用程序通过TCP
链接交换8bit
字节构成的字节流,TCP
不在字节流中插入记录标识符。
TCP
通过以下方式进行保证:1、数据包校验:目的是检测数据在传输过程中的任何变化,若校验出包有错,则丢弃报文段并且不给出响应,这时TCP
发送数据端超时后会重发数据;
2、对失序数据包重排序:既然TCP报文段
作为IP数据
报来传输,而IP数据
报的到达可能会失序,因此TCP报文段
的到达也可能会失序。TCP
将对失序数据进行重新排序,然后才交给应用层;
3、丢弃重复数据:对于重复数据,能够丢弃重复数据;
4、应答机制:当TCP
收到发自TCP
连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒;
5、超时重发:当TCP
发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段;
6、流量控制:TCP
连接的每一方都有固定大小的缓冲空间。TCP
的接收端只允许另一端发送接收端缓冲区所能接纳的数据,这可以防止较快主机致使较慢主机的缓冲区溢出,这就是流量控制。TCP
使用的流量控制协议是可变大小的滑动窗口协议。
浏览器搜索自己的DNS
缓存(维护一张域名与IP地址
的对应表);
搜索操作系统中的DNS
缓存(维护一张域名与IP地址
的对应表);
搜索操作系统的hosts文件
( Windows环境
下,维护一张域名与IP地址
的对应表);
操作系统将域名发送至LDNS(本地区域名服务器
),LDNS
查询自己的DNS缓存
(一般查找成功率在80%左右),查找成功则返回结果,失败则发起一个迭代DNS解析请求
:
LDNS
向 Root Name Server(根域名服务器
,如com、net、org等的解析的顶级域名服务器的地址)发起请求。
LDNS
向com域的顶级域名服务器发起请求,返回xx.com域名服务器地址;LDNS
向xx.com域名服务器发起请求,得到www.xx.com的IP地址;LDNS
将得到的IP地址
返回给操作系统,同时自己也将IP地址
缓存起来;操作系统将IP地址
返回给浏览器,同时自己也将IP地址
缓存起来。
URL
到页面加载发生了什么总体来说分为以下几个过程:
DNS
解析
TCP
连接
发送HTTP请求
服务器处理请求并返回HTTP报文
浏览器解析渲染页面
连接结束
HTTP
的几种请求方法的用途GET
方法:发送一个请求来取得服务器上的某一资源POST
方法:向URL指定的资源提交数据或附加新的数据PUT
方法:跟POST
方法很像,也是向服务器提交数据。但是,它们之间有不同。PUT
指定了资源在服务器上的位置,而POST
没有HEAD
方法:只请求页面的首部DELETE
方法:删除服务器上的某资源OPTIONS
方法:它用于获取当前URL
所支持的方法。如果请求成功,会有一个Allow
的头包含类似“GET,POST
”这样的信息TRACE
方法:TRACE方法被用于激发一个远程的,应用层的请求消息回路IP地址分为A,B,C,D,E五类。
IP地址分为五类,A类保留给政府机构,B类分配给中等规模的公司,C类分配给任何需要的人,D类用于组播,E类用于实验,各类可容纳的地址数目不同。
其中A类、B类、和C类这三类地址用于TCP/IP节点,其它两类D类和E类被用于特殊用途。
A、B、C三类IP地址的特征:当把IP地址写成二进制形式时,A类地址
的第一位总是0
,B类地址
的前两位总是10
,C
类地址的前三位总是110
。
1、A类地址第1字节为网络地址,其它3个字节为主机地址。
2、A类地址范围:1.0.0.1
—126.155.255.254
3、A类地址中的私有地址和保留地址:
10.X.X.X是
私有地址(所谓的私有地址就是在互联网上不使用,而被用在局域网络中的地址)127.X.X.X
是保留地址,用做循环测试用的1、B类地址第1字节和第2字节为网络地址,其它2个字节为主机地址。
2、B类地址范围:128.0.0.1
—191.255.255.254
。
3、B类地址的私有地址和保留地址:
172.16.0.0
—172.31.255.255
是私有地址169.254.X.X
是保留地址。如果你的IP地址是自动获取IP地址,而你在网络上又没有找到可用的DHCP服务器。就会得到其中一个IP1、C类地址第1字节、第2字节和第3个字节为网络地址,第4个个字节为主机地址。另外第1个字节的前三位固定为110。
2、C类地址范围:192.0.0.1
—223.255.255.254
。
3、C类地址中的私有地址:
192.168.X.X
是私有地址。D类地址不分网络地址和主机地址,它的第1个字节的前四位固定为1110。
D类地址范围:224.0.0.1
—239.255.255.254
E类地址也不分网络地址和主机地址,它的第1个字节的前五位固定为11110。
E类地址范围:240.0.0.1
—255.255.255.254
127.0.0.1
与 192.168.0.1
有什么区别没有区别。
两个IP
地址的角度不一样,127.0.0.1
是从IETF
(因特尔工程任务组)规定看,是保留给本机使用的 IP
地址,所有的计算机默认都是相同的。而 192.168.0.1
其实只是IETF
在 c 类网址
中,专门留出给专用网络用的一个网段中的一个 IP
而已,该网段包含了 192.168.0.1
到 192.168.255.255
中所有的 IP 地址。
1、在HTTP/1.0
中默认使用短连接。也就是说,客户端和服务器每进行一次HTTP
操作,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个HTML
或其他类型的Web页中包含有其他的Web资源(如JavaScrip
文件、图像文件、CSS
文件等),每遇到这样一个Web资源,浏览器就会重新建立一个HTTP会话。
2、而从HTTP/1.1
起,默认使用长连接,用以保持连接特性。使用长连接的HTTP
协议,会在响应头加入这行代码:
Connection:keep-alive
3、在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP
数据的TCP
连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。Keep-Alive
不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache
)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。
4、HTTP
协议的长连接和短连接,实质上是TCP
协议的长连接和短连接。
HTTP
协议是无状态的,指的是协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。也就是说,打开一个服务器上的网页和上一次打开这个服务器上的网页之间没有任何联系。HTTP
是一个无状态的面向连接的协议,无状态不代表HTTP
不能保持TCP
连接,更不能代表HTTP
使用的是UDP
协议(无连接)
Socket
连接与HTTP
连接的联系与区别通常情况下Socket
连接就是TCP
连接,因此Socket
连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开。但在实际网络应用中,客户端到服务器之间的通信往往需要穿越多个中间节点,例如路由器、网关、防火墙等,大部分防火墙默认会关闭长时间处于非活跃状态的连接而导致Socket
连接断连,因此需要通过轮询告诉网络,该连接处于活跃状态。
而HTTP
连接使用的是“请求—响应”的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据。
很多情况下,需要服务器端主动向客户端推送数据,保持客户端与服务器数据的实时与同步。此时若双方建立的是Socket
连接,服务器就可以直接将数据传送给客户端;若双方建立的是HTTP
连接,则服务器需要等到客户端发送一次请求后才能将数据传回给客户端,因此,客户端定时向服务器端发送连接请求,不仅可以保持在线,同时也是在“询问”服务器是否有新的数据,如果有就将数据传给客户端。
HTTP(TCP)
报文结构例如一个100kb的HTML
文档需要传送到另外一台计算机,并不会整个文档直接传送过去,可能会切割成几个部分,比如四个分别为25kb的数据段。而每个数据段再加上一个TCP
首部,就组成了TCP报文
。TCP报文 (Segment)
,包括首部和数据部分。
源端口 source port
目的端口 destination port
序号 sequence number
确认号 acknowledgment number
数据偏移 offset
保留 reserved
标志位 tcp flags
窗口大小 window size
检验和 checksum
紧急指针 urgent pointer
选项 tcp options
HTTP
的缓存机制HTTP
的缓存主要利用header里的两个字段来控制:
Cache-control
主要包含以及几个字段:
-private
:则只有客户端可以缓存
-public
:客户端和代理服务器都可以缓存
max-age
:缓存的过期时间no-cache
:需要使用对比缓存来验证缓存数据no-store
:所有内存都不会进行缓存ETag
:即用来进行对比缓存,Etag
是服务端资源的一个标识码
Etag
,下次再请求时,客户端则会通过heade
里的If-None-Match
将这个标识码Etag
带上,服务端将客户端传来的Etag
与最新的资源Etag
做对比,如果一样,则表示资源没有更新,返回304
。通过Cache-control
和Etag
的配合来实现HTTP
的缓存机制。
流量控制是对一条通信路径上的流量进行控制,就是发送方通过获取接收方的回馈来动态调整发送的速率,来达到控制流量的效果,其目的是保证发送者的发送速度不超过接收者的接收速度。
拥塞控制是对整个通信子网的流量进行控制,属于全局控制。
1、 慢开始+拥塞避免
一开始使用慢启动,即拥塞窗口设为 1,然后拥塞窗口指数增长到慢开始的门限值(ssthresh=16),则切换为拥塞避免,即加法增长,这样增长到一定程度,导致网络拥塞,则此时会把拥塞窗口重新降为 1,即重新慢开始,同时调整新的慢开始门限值为 12,之后以此类推。
2、 快重传+快恢复
快重传:重传机制都是等到超时还未收到接收方的回复,才开始进行重传。而快重传的设计思路是:如果发送方收到3个重复的接收方的ACK
,就可以判断有报文段丢失,此时就可以立即重传丢失的报文段,而不用等到设置的超时时间到了才开始重传,提高了重传的效率。
快恢复:拥塞控制会在网络拥塞时将拥塞窗口降为1,重新慢开始,这样存在的一个问题就是网络无法很快恢复到正常状态。快恢复就是来优化这个问题的,使用快恢复,则出现拥塞时,拥塞窗口只会降低到新的慢开始门阀值(即12),而不会降为1,然后直接开始进入拥塞避免加法增长。如下图:
http 1.1
与 http 1.0
的区别http 1.0
对于每个连接都得建立一次连接, 一次只能传送一个请求和响应, 请求就会关闭, http1.0
没有 Host
字段
而http1.1
在同一个连接中可以传送多个请求和响应, 多个请求可以重叠和同时进行, http1.1
必须有host
字段
http1.1
中引入了ETag
头, 它的值 entity tag
可以用来唯一的描述一个资源. 请求消息中可以使用 If-None-Match
头域来匹配资源的 entitytag
是否有变化
http1.1
新增了 Cache-Control
头域(消息请求和响应请求都可以使用), 它支持一个可扩展的指令子集
http1.0
中只定义了 16 个状态响应码
, 对错误或警告的提示不够具体. http1.1
引入了一个 Warning
头域, 增加对错误或警告信息的描述. 且新增了 24
个状态响应码
Http 2.0
与 http1.x
相比有什么优点二进制格式:http1.x
是文本协议,而 http2.0
是二进制以帧为基本单位,是一个二进制协议,一帧中除了包含数据外同时还包含该帧的标识:Stream Identifier
,即标识了该帧属于哪个 request
,使得网络传输变得十分灵活。
多路复用: 一个很大的改进,原先 http1.x
一个连接一个请求的情况有比较大的局限性,也引发了很多问题,如建立多个连接的消耗以及效率问题。
1、http1.x
为了解决效率问题,可能会尽量多的发起并发的请求去加载资源,然而浏览器对于同一域名下的并发请求有限制,而优化的手段一般是将请求的资源放到不同的域名下来突破这种限制。
2、而 http2.0
支持的多路复用可以很好的解决这个问题,多个请求共用一个 TCP
连接,多个请求可以同时在这个 TCP
连接上并发,一个是解决了建立多个 TCP
连接的消耗问题,一个也解决了效率的问题。那么是什么原理支撑多个请求可以在一个 TCP
连接上并发呢?基本原理就是上面的二进制分帧,因为每一帧都有一个身份标识,所以多个请求的不同帧可以并发的无序发送出去,在服务端会根据每一帧的身份标识,将其整理到对应的request
中。
header 头部压缩:主要是通过压缩 header 来减少请求的大小,减少流量消耗,提高效率。因为之前存在一个问题是,每次请求都要带上 header,而这个 header 中的数据通常是一层不变的。
支持服务端推送
参考链接:https://mp.weixin.qq.com/s/hOKfbgd-nRn2lboXMCiY8w?