网络知识面面观

HTTP响应常见状态码

博文连接: 网络知识面面观
状态码 描述
100-199 成功接收请求, 要求客户端继续提交下一次请求才能完成整个处理过程
200-299 成功接收请求并已完成整个处理过程,经常使用200
300-399 为完成请求, 需进一步细化需求: 例如: 请求的资源已经移动一个新地址,经常使用302(重定向),307304(拿缓存)
400-499 客户端的请求有错误, 包含语法错误或者不能正确执行。 经常使用404(请求的资源在web服务器中没有),403(服务器拒绝访问, 权限不够)
500-599 服务器端出现错误
200 表示一切正常, 返回的是正常请求结果
302/307 临时重定向,指出请求的文档已被临时移动到别处, 此文档的新的urllocation响应头中给出
304 未修改,表示客户端缓存的版本是最新的, 客户端应该继续使用它
403 禁止,服务器理解客户端请求,但拒绝处理它,一般用于服务器上文件或目录的权限设置所致
404 找不到,服务器上不存在客户端所请求的资源
500 服务器内部错误,服务器端的cgiaspjsp等程序发生错误

TCP三次握手和四次挥手

  • 创建TCP链接须要三次握手:首先Client端发送链接请求报文,Server端接收链接后回复ACK报文,并为此次链接分配资源。Client端接收到 ACK报文后也向Server端发发送ACK报文,并分配资源,这样TCP链接就创建了。git

    • 第一步:客户端的TCP先向服务器的TCP发送一个链接请求报文。这个特殊的报文中不含应用层数据,其首部中的SYN标志位被置1。另外, 客户端会随机选择一个起始序号seq=x(链接请求报文不携带数据,但要消耗掉一个序号)。
    • 第二步:服务器端的TCP收到链接请求报文后,若赞成创建链接,就向客户端发送请求,并为该TCP链接分配TCP缓存和变量。在确认报文中,SYNACK位都被置为1, 确认好字段的值为x+1,而且服务器随机产生起始序号seq=y(确认报文不携带数据, 但也要消耗掉一个序号)。确认报文一样不包含应用层数据。
    • 第三步:当客户端收到确认报文后,还要向服务器给出确认,而且也要给该链接分配缓存和变量。这个报文的ACK标志位被置为1,序号字段为x+1,确认号字段为y+1
  • 四次挥手github

    • 第一步:客户端打算关闭链接,就向其TCP发送一个链接释放报文,并中止再发送数据,主动关闭TCP链接,该报文的FIN标志位被置1seq=u,它等于前面已经传送过的数据的最后一个字节的序号加1(FIN报文即便不携带数据,也要消耗掉一个序号)。
    • 第二步:服务器接收链接释放报文后即发出确认,确认号是ack=u+1,这个报文本身的序号是v,等于它前面已传送过的数据的最后一个本身的序号加1。此时,从客户端到服务器这个方向的链接就释放了,TCP链接处于半关闭状态。但服务器若发送数据,客户端仍要接收,即从服务器到客户机的链接仍未关闭。
    • 第三步:若服务器已经没有了要向客户端发送的数据,就通知TCP释放链接,此时其发出FIN=1的链接释放报文。
    • 第四步: 客户端收到链接释放报文后,必须发出确认。在确认报文中,ACK字段被置为1,确认号ack=w+1,序号seq=u+1。此时,TCP链接尚未释放掉,必须通过等待计时器设置的时间2MSL后, A才进入到链接关闭状态。

计算机网络体系结构

应用层

应用层( application-layer)的任务是经过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程(进程:主机中正在运行的程序)间的通讯和交互的规则。对于不一样的网络应用须要不一样的应用层协议。在互联网中应用层协议不少,如域名系统 DNS,支持万维网应用的 HTTP 协议,支持电子邮件的 SMTP 协议等等。咱们把应用层交互的数据单元称为报文。

域名系统web

域名系统( Domain Name System 缩写 DNSDomain Name被译为域名)是因特网的一项核心服务,它做为能够将域名和 IP地址相互映射的一个分布式数据库,可以令人更方便的访问互联网,而不用去记住可以被机器直接读取的 IP数串。

http协议数据库

超文本传输协议( HTTPHyperText Transfer Protocol)是互联网上应用最为普遍的一种网络协议。全部的 WWW(万维网) 文件都必须遵照这个标准。

运输层

运输层( transport layer)的主要任务就是负责向两台主机进程之间的通讯提供通用的数据传输服务。应用进程利用该服务传送应用层报文。“通用的”是指并不针对某一个特定的网络应用,而是多种应用可使用同一个运输层服务。因为一台主机可同时运行多个线程,所以运输层有复用和分用的功能。所谓复用就是指多个应用层进程可同时使用下面运输层的服务,分用和复用相反,是运输层把收到的信息分别交付上面应用层中的相应进程。

运输层经常使用的两种协议TCP UDP

  • 传输控制协议TCPTransmisson Control Protocol)--提供面向链接的,可靠的数据传输服务。
  • 用户数据协议UDPUser Datagram Protocol)--提供无链接的,尽最大努力的数据传输服务(不保证数据传输的可靠性)。

TCP的主要特色后端

  • TCP是面向链接的。(就好像打电话同样,通话前须要先拨号创建链接,通话结束后要挂机释放链接);
  • 每一条TCP链接只能有两个端点,每一条TCP链接只能是点对点的(一对一);
  • TCP提供可靠交付的服务。经过TCP链接传送的数据,无差错、不丢失、不重复、而且按序到达;
  • TCP提供全双工通讯。TCP容许通讯双方的应用进程在任什么时候候都能发送数据。TCP链接的两端都设有发送缓存和接收缓存,用来临时存放双方通讯的数据;
  • 面向字节流。TCP中的“流”(Stream)指的是流入进程或从进程流出的字节序列。“面向字节流”的含义是:虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序接下来的数据仅仅当作是一连串的无结构的字节流。

UDP的主要特色浏览器

  • UDP是无链接的;
  • UDP使用尽最大努力交付,即不保证可靠交付,所以主机不须要维持复杂的连接状态(这里面有许多参数);
  • UDP是面向报文的;
  • UDP没有拥塞控制,所以网络出现拥塞不会使源主机的发送速率下降(对实时应用颇有用,如直播,实时视频会议等);
  • UDP支持一对1、一对多、多对一和多对多的交互通讯;
  • UDP的首部开销小,只有8个字节,比TCP20个字节的首部要短。

网络层

  • 在计算机网络中进行通讯的两个计算机之间可能会通过不少个数据链路,也可能还要通过不少通讯子网。网络层的任务就是选择合适的网间路由和交换结点, 确保数据及时传送。在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组和包进行传送。在TCP/IP体系结构中,因为网络层使用IP协议,所以分组也叫IP数据报 ,简称数据报
  • 互联网是由大量的异构(heterogeneous)网络经过路由器(router)相互链接起来的。互联网使用的网络层协议是无链接的网际协议(Intert Prococol)和许多路由选择协议,所以互联网的网络层也叫作网际层或IP层。

数据链路层

  • 数据链路层(data link layer)一般简称为链路层。两台主机之间的数据传输,老是在一段一段的链路上传送的,这就须要使用专门的链路层的协议。 在两个相邻节点之间传送数据时,数据链路层将网络层接下来的IP数据报组装成帧,在两个相邻节点间的链路上传送帧。每一帧包括数据和必要的控制信息(如同步信息,地址信息,差错控制等)。
  • 在接收数据时,控制信息使接收端可以知道一个帧从哪一个比特开始和到哪一个比特结束。这样,数据链路层在收到一个帧后,就可从中提取数据部分,上交给网络层。控制信息还使接收端可以检测到所收到的帧中有无差错。若是发现差错,数据链路层就简单地丢弃这个出了差错的帧,以免继续在网络中传送下去,浪费网络资源。若是须要改正数据在链路层传输时出现差错(这就是说,数据链路层不只要检错,并且还要纠错),那么就要采用可靠性传输协议来纠正出现的差错。这种方法会使链路层的协议复杂些。

物理层

  • 在物理层上所传送的数据单位是比特。 物理层(physical layer)的做用是实现相邻计算机节点之间比特流的透明传送,尽量屏蔽掉具体传输介质和物理设备的差别。使其上面的数据链路层没必要考虑网络的具体传输介质是什么。“透明传送比特流”表示经实际电路传送后的比特流没有发生变化,对传送的比特流来讲,这个电路好像是看不见的。
  • 在互联网使用的各类协中最重要和最著名的就是TCP/IP两个协议。

计算机网络的七层体系结构图

HTTPHTTPS的区别

HTTP协议运行在TCP之上,明文传输,客户端与服务器端都没法验证对方的身份;HTTPS是身披SSL(Secure Socket Layer)外壳的HTTP,运行于SSL上,SSL运行于TCP之上,是添加了加密和认证机制的HTTP。两者之间存在以下不一样:缓存

  • 端口不一样:HTTPSHTTP使用不一样的链接方式,用的端口也不同,前者是80,后者是443
  • 资源消耗:和HTTP通讯相比,HTTPS通讯会因为加减密处理消耗更多的CPU和内存资源;
  • 开销:HTTPS通讯须要证书,而证书通常须要向认证机构购买;
  • HTTPS的加密机制是一种共享密钥加密和公开密钥加密并用的混合加密机制。

对称加密与非对称加密

  • 对称密钥加密是指加密和解密使用同一个密钥的方式,这种方式存在的最大问题就是密钥发送问题,即如何安全地将密钥发给对方;而非对称加密是指使用一对非对称密钥,即公钥和私钥,公钥能够随意发布,但私钥只有本身知道。发送密文的一方使用对方的公钥进行加密处理,对方接收到加密信息后,使用本身的私钥进行解密。
  • 因为非对称加密的方式不须要发送用来解密的私钥,因此能够保证安全性;可是和对称加密比起来,它很是的慢,因此咱们仍是要用对称加密来传送消息,但对称加密所使用的密钥咱们能够经过非对称加密的方式发送出去。

TCP协议如何保持传输的可靠性

TCP提供一种面向链接的、可靠的字节流服务。其中,面向链接意味着两个使用 TCP的应用(一般是一个客户和一个服务器)在彼此交换数据以前必须先创建一个 TCP链接。在一个 TCP链接中,仅有两方进行彼此通讯;而字节流服务意味着两个应用程序经过 TCP连接交换 8bit字节构成的字节流, TCP不在字节流中插入记录标识符。

对于可靠性,TCP经过如下方式进行保证:安全

  • 数据包校验:目的是检测数据在传输过程当中的任何变化,若校验出包有错,则丢弃报文段而且不给出响应,这时TCP发送数据端超时后会重发数据;
  • 对失序数据包重排序:既然TCP报文段做为IP数据报来传输,而IP数据报的到达可能会失序,所以TCP报文段的到达也可能会失序。TCP将对失序数据进行从新排序,而后才交给应用层;
  • 丢弃重复数据:对于重复数据,可以丢弃重复数据;
  • 应答机制:当TCP收到发自TCP链接另外一端的数据,它将发送一个确认。这个确认不是当即发送,一般将推迟几分之一秒;
  • 超时重发:当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。若是不能及时收到一个确认,将重发这个报文段;
  • 流量控制TCP链接的每一方都有固定大小的缓冲空间。TCP的接收端只容许另外一端发送接收端缓冲区所能接纳的数据,这能够防止较快主机导致较慢主机的缓冲区溢出,这就是流量控制。TCP使用的流量控制协议是可变大小的滑动窗口协议。

查找域名对应的IP地址

这一步包括 DNS具体的查找过程,包括:浏览器缓存->系统缓存->路由器缓存...
  • 浏览器搜索本身的DNS缓存(维护一张域名与IP地址的对应表);
  • 搜索操做系统中的DNS缓存(维护一张域名与IP地址的对应表);
  • 搜索操做系统的hosts文件( Windows环境下,维护一张域名与IP地址的对应表);
  • 操做系统将域名发送至LDNS(本地区域名服务器),LDNS查询本身的DNS缓存(通常查找成功率在80%左右),查找成功则返回结果,失败则发起一个迭代DNS解析请求:服务器

    • LDNSRoot Name Server(根域名服务器,如comnetorg等的解析的顶级域名服务器的地址)发起请求,此处,Root Name Server返回com域的顶级域名服务器的地址;
    • LDNScom域的顶级域名服务器发起请求,返回baidu.com域名服务器地址;
    • LDNSbaidu.com域名服务器发起请求,获得www.baidu.comIP地址;
  • LDNS将获得的IP地址返回给操做系统,同时本身也将IP地址缓存起来;
  • 操做系统将IP地址返回给浏览器,同时本身也将IP地址缓存起来。

从输入URL到页面加载发生了什么

整体来讲分为如下几个过程:cookie

  • DNS解析
  • TCP链接
  • 发送HTTP请求
  • 服务器处理请求并返回HTTP报文
  • 浏览器解析渲染页面
  • 链接结束

HTTP的几种请求方法的用途

  • GET方法:发送一个请求来取得服务器上的某一资源
  • POST方法:向URL指定的资源提交数据或附加新的数据
  • PUT方法:跟POST方法很像,也是向服务器提交数据。可是,它们之间有不一样。PUT指定了资源在服务器上的位置,而POST没有
  • HEAD方法:只请求页面的首部
  • DELETE方法:删除服务器上的某资源
  • OPTIONS方法:它用于获取当前URL所支持的方法。若是请求成功,会有一个Allow的头包含相似“GET,POST”这样的信息
  • TRACE方法:TRACE方法被用于激发一个远程的,应用层的请求消息回路
  • CONNECT方法:把请求链接转换到透明的TCP/IP通道

五类IP地址的范围

IP地址分为A,B,C,D,E五类。

  • 网络号:用于识别主机所在的网络;
  • 主机号:用于识别该网络中的主机。

其中A类分配给政府机关使用,B类地址给大中型企业使用,C类地址给我的使用。这三种是主要的。

IP地址分为五类,A类保留给政府机构,B类分配给中等规模的公司,C类分配给任何须要的人,D类用于组播,E类用于实验,各种可容纳的地址数目不一样。

其中A类、B类、和C类这三类地址用于TCP/IP节点,其它两类D类和E类被用于特殊用途。ABC三类IP地址的特征:当把IP地址写成二进制形式时,A类地址的第一位老是0B类地址的前两位老是10C类地址的前三位老是110

A类地址

  1. A类地址第1字节为网络地址,其它3个字节为主机地址。
  2. A类地址范围:1.0.0.1126.155.255.254
  3. A类地址中的私有地址和保留地址:

    • 10.X.X.X是私有地址(所谓的私有地址就是在互联网上不使用,而被用在局域网络中的地址)
    • 127.X.X.X是保留地址,用作循环测试用的

B类地址

  1. B类地址第1字节和第2字节为网络地址,其它2个字节为主机地址。
  2. B类地址范围:128.0.0.1191.255.255.254
  3. B类地址的私有地址和保留地址:

    • 172.16.0.0172.31.255.255是私有地址
    • 169.254.X.X是保留地址。若是你的IP地址是自动获取IP地址,而你在网络上又没有找到可用的DHCP服务器。就会获得其中一个IP

C类地址

  1. C类地址第1字节、第2字节和第3个字节为网络地址,第4个个字节为主机地址。另外第1个字节的前三位固定为110
  2. C类地址范围:192.0.0.1223.255.255.254
  3. C类地址中的私有地址:

    • 192.168.X.X 是私有地址。

D类地址

  1. D类地址不分网络地址和主机地址,它的第1个字节的前四位固定为1110
  2. D类地址范围:224.0.0.1239.255.255.254

E类地址

  1. E类地址也不分网络地址和主机地址,它的第1个字节的前五位固定为11110
  2. E类地址范围:240.0.0.1255.255.255.254

HTTP长链接、短链接

  • HTTP/1.0中默认使用短链接。也就是说,客户端和服务器每进行一次HTTP操做,就创建一次链接,任务结束就中断链接。当客户端浏览器访问的某个HTML或其余类型的Web页中包含有其余的Web资源(如JavaScript文件、图像文件、CSS文件等),每遇到这样一个Web资源,浏览器就会从新创建一个HTTP会话。
  • 而从HTTP/1.1起,默认使用长链接,用以保持链接特性。使用长链接的HTTP协议,会在响应头加入这行代码:Connection:keep-alive
  • 在使用长链接的状况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP链接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经创建的链接。Keep-Alive不会永久保持链接,它有一个保持时间,能够在不一样的服务器软件(如Apache)中设定这个时间。实现长链接须要客户端和服务端都支持长链接。
  • HTTP协议的长链接和短链接,实质上是TCP协议的长链接和短链接。

如何理解HTTP协议是无状态的

HTTP协议是无状态的,指的是协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。也就是说,打开一个服务器上的网页和上一次打开这个服务器上的网页之间没有任何联系。 HTTP是一个无状态的面向链接的协议,无状态不表明 HTTP不能保持 TCP链接,更不能表明 HTTP使用的是 UDP协议(无链接)。

各类协议与HTTP协议之间的关系

Socket链接与HTTP链接的联系与区别

  • 一般状况下Socket链接就是TCP链接,所以Socket链接一旦创建,通讯双方便可开始相互发送数据内容,直到双方链接断开。但在实际网络应用中,客户端到服务器之间的通讯每每须要穿越多个中间节点,例如路由器、网关、防火墙等,大部分防火墙默认会关闭长时间处于非活跃状态的链接而致使Socket链接断连,所以须要经过轮询告诉网络,该链接处于活跃状态。
  • HTTP链接使用的是“请求—响应”的方式,不只在请求时须要先创建链接,并且须要客户端向服务器发出请求后,服务器端才能回复数据。
  • 不少状况下,须要服务器端主动向客户端推送数据,保持客户端与服务器数据的实时与同步。此时若双方创建的是Socket链接,服务器就能够直接将数据传送给客户端;若双方创建的是HTTP链接,则服务器须要等到客户端发送一次请求后才能将数据传回给客户端,所以,客户端定时向服务器端发送链接请求,不只能够保持在线,同时也是在“询问”服务器是否有新的数据,若是有就将数据传给客户端。

HTTP(TCP) 报文结构

例如一个 100kbHTML文档须要传送到另一台计算机,并不会整个文档直接传送过去,可能会切割成几个部分,好比四个分别为 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,下次再请求时,客户端则会经过header里的If-None-Match将这个标识码Etag带上,服务端将客户端传来的Etag与最新的资源Etag作对比,若是同样,则表示资源没有更新,返回304

经过Cache-controlEtag的配合来实现HTTP的缓存机制。

Cookie

Cookie就是用来在本地缓存记住一些状态的,一个 Cookie通常都包含 domain(所属域)、 pathExpires(过时时间)等几个属性。服务端能够经过在响应头 set-cookies将状态写入客户端的 Cookie中。

HTTP 2.0HTTP 1.x相比有什么优势

  • 二进制格式HTTP 1.x是文本协议,而HTTP 2.0是二进制以帧为基本单位,是一个二进制协议,一帧中除了包含数据外同时还包含该帧的标识:Stream Identifier,即标识了该帧属于哪一个request,使得网络传输变得十分灵活。
  • 多路复用: 一个很大的改进,原先HTTP 1.x一个链接一个请求的状况有比较大的局限性,也引起了不少问题,如创建多个链接的消耗以及效率问题。

    • HTTP 1.x为了解决效率问题,可能会尽可能多的发起并发的请求去加载资源,然而浏览器对于同一域名下的并发请求有限制,而优化的手段通常是将请求的资源放到不一样的域名下来突破这种限制。
    • HTTP 2.0支持的多路复用能够很好的解决这个问题,多个请求共用一个TCP链接,多个请求能够同时在这个TCP链接上并发,一个是解决了创建多个TCP链接的消耗问题,一个也解决了效率的问题。那么是什么原理支撑多个请求能够在一个TCP链接上并发呢?基本原理就是上面的二进制分帧,由于每一帧都有一个身份标识,因此多个请求的不一样帧能够并发的无序发送出去,在服务端会根据每一帧的身份标识,将其整理到对应的request中。
  • header 头部压缩:主要是经过压缩header来减小请求的大小,减小流量消耗,提升效率。由于以前存在一个问题是,每次请求都要带上 header,而这个header中的数据一般是一成不变的。
  • 支持服务端推送

流量控制

流量控制是对一条通讯路径上的流量进行控制,就是发送方经过获取接收方的回馈来动态调整发送的速率,来达到控制流量的效果,其目的是保证发送者的发送速度不超过接收者的接收速度。

拥塞控制

拥塞控制是对整个通讯子网的流量进行控制,属于全局控制。
  1. 慢开始+拥塞避免
  2. 快重传+快恢复

    • 快重传:重传机制都是等到超时还未收到接收方的回复,才开始进行重传。而快重传的设计思路是:若是发送方收到3个重复的接收方的ACK,就能够判断有报文段丢失,此时就能够当即重传丢失的报文段,而不用等到设置的超时时间到了才开始重传,提升了重传的效率。
    • 快恢复:拥塞控制会在网络拥塞时将拥塞窗口降为1,从新慢开始,这样存在的一个问题就是网络没法很快恢复到正常状态。快恢复就是来优化这个问题的,使用快恢复,则出现拥塞时,拥塞窗口只会下降到新的慢开始门阀值(即12),而不会降为1,而后直接开始进入拥塞避免加法增加。
原文连接: 先后端均适用的网络知识点大全