OSI(Open System Interconnection Reference Model开放式系统互联通信参考模型)七层模型和对应的协议

由国际标准化组织ISO提出。每一层都是一个协议包。应用层并不意味着它包括计算机应用程序,而是包含了应用层协议,从而使应用程序在网络中正确运行。

应用层:Web浏览器是在PC中运行的网络应用程序,它并不在应用层,而是使用应用层一些HTTP或HTTPS来做。还有其他网络应用,例如outlook和skype,所有功能都依赖于应用层协议。应用层有十几个协议,这些协议构成了各种网络服务的基础。例如文件传输、网上冲浪、电子邮件、虚拟终端等。文件传输是借助FTP协议完成的,网上冲浪是借助HTTP或HTTPS协议完成的,对于电子邮件,使用SMTP协议,对于虚拟终端,使用Telnet协议。

表示层:翻译、压缩、加密/解密

  • 表示层从应用层接收数据,这些数据是以字符和数字的形式出现的,表示层将这些字符和数字转换成机器可理解的二进制形式,例如,将ASCII码转换为EBCDIC码。表示层的这个功能称为“翻译”。
  • 在数据传输之前,表示层减少了用来表示原始数据的比特数,这个演算过程被称为数据压缩,可以是有损或无损的。数据压缩减少了存储原始数据所需的空间,随着文件的减小,数据传输可以很快。对于实时视频和音频传输有很大的帮助。
  • 以保证完整性的数据传输前的数据加密。加密和解密是敏感数据的安全保障。数据在发送端被加密,在接收端数据被解密为SSL协议或安全套接字。使用表示层进行加密和解密。

会话层:会话层建立和管理连接启用、发送和接收数据。会话层的助手就是APIs或应用程序接口。NetBIOS,即网络基本输入输出系统,可作为APIs的例子,它允许不同计算机上的应用程序相互通信。就在与服务器建立会话或连接之前,服务器会执行一项身份认证的功能。此服务器使用用户名和密码,输入后,用户名和密码将被管理,您的计算机和服务器之间将建立会话和连接。身份验证之后,将检查用户授权,授权是服务器用来确定你是否有访问文件的权限的过程。身份认证和授权这两个功能都由会话层执行。会话层提供正在下载的文件的跟踪。例如,网页包含文本、图像等。这些文本和图像作为单独的文件存储在Web服务器上,当您在Web浏览器中请求网站时,您的Web浏览器将打开到Web服务器的单独会话,以便分别下载这些文本和图像文件。这些文件以数据包的形式接收,本质上给出了数据包属于哪个文件的轨迹,是文本文件,还是图像文件,并跟踪他们收到数据包的位置。

网络浏览器会执行所有的功能,包括会话层、表示层和应用层。

传输层:传输层通过分段流量控制差错控制来控制通信的可靠性。在分段中,从会话层接收的数据,被分成称为段的小数据单元,每个网段包含一个源端口号、目的端口号和序列号。这些号码有助于引导每个网段指向正确的应用程序。序列号有助于按照正确的顺序重新组合段,以便在接收者处形成正确的消息。在流量控制中,传输层控制传输的数据量。假设一个移动设备连接到一个服务器,假设服务器最大可以传输100Mbps的数据,而我们的移动设备最大可以处理10Mbps的数据。现在我们正在从服务器下载一个文件,但是服务开始以50Mbps的速度发送数据,这比手机所能处理的速率要高,所以手机在传输层的帮助下,可以告诉服务器将数据传输速率降低到10Mbps,这样就不会有数据丢失。类似地,如果服务器以5Mbps的速度发送数据,手机会告知服务器增加数据传输,提升到10Mbps来保持系统性能。在差错控制中,如果某些数据没有到达,目标传输层将使用自动重复请求方案,来重新传输丢失或损坏的数据。传输层向每个段添加一组称为“校验和”的位,找出所接收到的传输层协议和控制协议或TCP以及UDP的更新段。传输层执行两种类型的服务,TCP面向连接,UDP无连接。UDP比TCP更快,因为他不会提供任何关于数据是否真正交付的反馈

应用层:OSI参考模型中最靠近用户的一层,是为计算机用户提供应用接口,也为用户直接提供各种网络服务。。。。

表示层:表示层提供各种用于应用层数据的编码和转换功能,确保一个系统的应用层发送的数据能被另一个系统的应用层识别。如果必要,该层可提供一种标准表示形式,用于计算机内部的多种数据格式转换成通信中采用的标准表示形式。数据压缩和加密也是该层可提供的转换功能之一。

会话层:会话层负责建立、管理和终止表示层实体之间的通信会话。该层的通信由不同设备中的应用程序之间的服务请求和响应组成。

传输层:传输层建立了主机端到端的连接,传输层的作用是为上层协议提供端到端的可靠和透明的数据传输服务,包括处理差错控制和流量控制等问题。该层向高层屏蔽了下层数据通信的细节,使高层用户看到的只是在两个传输实体间的一条主机到主机的、可由用户控制和设定的、可靠的数据通路。我们通常说的,TCP UDP就是在这一层。端口号就是这里的“端”。

网络层:本层通过IP寻址来建立两个节点间的连接,为源端的运输层送来的分组,选择合适的路由和交换节点,正确无误地按照地址传送给目的端的运输层。这一层就是我们常说的IP协议层,IP协议层是Internet的基础。

数据链路层:将比特组合成字节,再将字节组合成帧,使用链路层地址(以太网使用MAC地址)来访问介质,并进行差错检测。

物理层:实际最终信号的传输是通过物理层实现的。通过物理介质传输比特流,规定了电平、速度和电缆针脚。

 

原文链接:https://www.cnblogs.com/qishui/p/5428938.html

 

七层模型对应的协议:

应用层:HTTP,HTTPS,FTP,POP3、SMTP、Telnet、DNS

表示层:JPEG、MPEG、ASII

会话层:JPEG、MPEG、ASII

传输层:TCP、UDP、SPX

网络层:IP、ICMP、ARP、RARP、OSPF、IPX、RIP、IGRP、 (路由器

数据链路层:PPP、FR、HDLC、VLAN、MAC (网桥,交换机

物理层:RJ45、CLOCK、IEEE802.3 (中继器,集线器,网关

比较重要的协议:IP、TCP、UDP、HTTP

TCP/IP五层协议模型

 

 

相关概念

1. URL和URI

  • URI (Uniform Resource Identifier) 是统一资源标志符,可以唯一标识一个资源。
  • URL (Uniform Resource Location) 是统一资源定位符,可以提供该资源的路径。它是一种具体的 URI,即 URL 可以用来标识一个资源,而且还指明了如何 locate 这个资源。

URI 的作用像身份证号一样,URL 的作用更像家庭住址一样。URL 是一种具体的 URI,它不仅唯一标识资源,而且还提供了定位该资源的信息。

2. URL的组成

URL 一般有四部分组成:<协议>://< 主机 >:< 端口 >/< 路径 >?<参数>

  • 现在最常用的 <协议> 为 http 协议。
  • <主机> 是指主机在因特网上的域名。可以是域名,也可以是主机名,或 IP 地址。
  • http 协议的默认 <端口> 为 80(如果省略则就是80端口)。
  •  <路径> 访问的资源在服务器下的相对路径,不是在服务器的绝对路径,是服务器上的一个目录或者文件地址。https://baike.baidu.com/item/url/110640?fr=aladdin
  • <参数>从“?”开始到“#”(或至结束)为止之间的部分为参数部分,又称搜索部分、查询部分。参数间用“&”作为分隔符。http://10.1.192.66:8080/zentao/index.php?m=task&f=view&task=4640 

3. 从输入网址到获得页面的过程

1)浏览器查询 DNS,获取域名对应的 IP 地址:具体过程包括浏览器搜索自身的 DNS 缓存、搜索操作系统的 DNS 缓存、读取本地的 Host 文件和向本地 DNS 服务器进行查询。DNS是一种分层数据库,本地DNS起着代理的作用,会将请求转发到DNS服务器层次系统中。层次系统由根域名服务器->顶级域名服务器->权威域名服务器构成,进行递归(根域名服务器无法告知本地DNS服务器下一步需要访问哪个顶级域名服务器)或迭代查询(能告知),最终由权威域名服务器告知本地DNS服务器目标IP地址,再由本地DNS服务器告诉用户需要访问的IP地址。

2)浏览器获得域名对应的 IP 地址以后,浏览器向服务器请求建立链接,发起TCP三次握手

3)TCP/IP 链接建立起来后,浏览器向服务器发送 HTTP 请求

4)服务器接收到这个请求,如果目标服务器只是一个简单的页面,就直接返回。但有些大网站有很多的主机站点,为了负载均衡,所以会做重定向,返回301,302以3开头的重定向码,浏览器获取重定向相应后,在响应报文中Location字段找到重定向地址,浏览器重新开始第一步访问。

5)请求成功后,服务器会处理请求,响应200,OK。

6)TCP四次挥手,显示浏览器页面,浏览器获取内容。

总结:ip——tcp——http——定位资源——渲染页面展示页面 

 

递归与迭代查询的区别:

1)主机向本地域名服务器查询一般都是采用递归查询

所谓递归查询就是:如果主机所询问的本地域名服务器不知道被查询的域名的IP地址,那么本地域名服务器就以DNS客户的身份向其他根域名服务器继续发出查询请求报文(即替主机继续查询),而不是让主机自己进行下一步查询

因此,递归查询返回的查询结果或者是所要查询的IP地址,或者是报错,表示无法查询到所需的IP地址。

2)本地域名服务器向根域名服务器的查询的迭代查询

当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的IP地址,要么告诉本地服务器:你下一步应该向哪一个域名服务器进行查询。然后让本地域名服务器进行后续查询。根域名服务器通常是把自己知道的顶级域名服务器的IP地址告诉本地域名服务器,让本地域名服务器再向顶级域名服务器查询。顶级域名服务器在收到本地域名服务器的查询请求后,要么给出所要查询的IP地址,要么告诉本地服务器下一步应当向哪一个权威域名服务器进行查询。

最后,知道了所要解析的IP地址或报错,然后把这个结果返回给发起查询的主机。

4. 状态码

 当访问一个网页时,浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器的请求。

下面是常见的HTTP状态码:

  • 200 - 请求成功
  • 301 - 资源(网页等)被永久转移到其它URL
  • 404 - 请求的资源(网页等)不存在
  • 500 - 内部服务器错误

HTTP状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用。HTTP状态码共分为5种类型:

 

 5. Forward和Redirect

Forward和Redirect代表了两种请求转发方式:直接转发和间接转发。

直接转发方式(Forward)客户端和浏览器只发出一次请求,Servlet、HTML、JSP或其它信息资源,由第二个信息资源响应该请求,在请求对象request中,保存的对象对于每个信息资源是共享的。

间接转发方式(Redirect)实际是两次HTTP请求,服务器端在响应第一次请求的时候,让浏览器再向另外一个URL发出请求,从而达到转发的目的。

举个通俗的例子:

  直接转发就相当于:“A找B借钱,B说没有,B去找C借,借到借不到都会把消息传递给A”;

  间接转发就相当于:"A找B借钱,B说没有,让A去找C借"。

原理:

一、间接请求转发(Redirect)

间接转发方式,有时也叫重定向,它一般用于避免用户的非正常访问。例如:用户在没有登录的情况下访问后台资源,Servlet可以将该HTTP请求重定向到登录页面,让用户登录以后再访问。

 

重定向过程

  • 客户浏览器发送http请求

  • web服务器接受后发送302状态码响应及对应新的location给客户浏览器

  • 客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址

  • 服务器根据此请求寻找资源并发送给客户。

 二、直接请求转发(Forward)

直接转发方式用的更多一些,一般说的请求转发指的就是直接转发方式。Web应用程序大多会有一个控制器。由控制器来控制请求应该转发给那个信息资源。然后由这些信息资源处理请求,处理完以后还可能转发给另外的信息资源来返回给用户,这个过程就是经典的MVC模式。

 

 技巧:其实,通过浏览器就可以观察到服务器端使用了那种请求转发方式,当单击某一个超链接时,浏览器的地址栏会出现当前请求的地址,如果服务器端响应完成以后,发现地址栏的地址变了,则证明是间接的请求转发。相反,如果地址没有发生变化,则代表的是直接请求转发或者没有转发

问:直接转发和间接转发的原理及区别是什么?

答:Forward和Redirect代表了两种请求转发方式:直接转发和间接转发。对应到代码里,分别是RequestDispatcher类的forward()方法和HttpServletRequest类的sendRedirect()方法。

  对于间接方式,服务器端在响应第一次请求的时候,让浏览器再向另外一个URL发出请求,从而达到转发的目的。它本质上是两次HTTP请求,对应两个request对象

  对于直接方式,客户端浏览器只发出一次请求,Servlet把请求转发给Servlet、HTML、JSP或其它信息资源,由第2个信息资源响应该请求,两个信息资源共享同一个request对象。

  转发是服务器行为,重定向是客户端行为。

6. socket

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议

应用层通过传输层进行数据通信时,TCP 会遇到同时为多个应用程序进程提供并发服务的问题。多个 TCP 连接或多个应用程序进程可能需要通过同一个 TCP 协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与 TCP/IP 协议交互提供了套接字 (Socket) 接口。应用层可以和传输层通过 Socket 接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务

7. session和cookie

HTTP是一种不保存状态,即无状态协议。HTTP协议自身不对请求和相应之间的通信状态进行保存。那么我们保存用户状态呢?session和cookie机制的存在就是为了解决这个问题。

Cookie是某些网站为了辨别用户身份,进行Session跟踪而存储在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息。

Session是通过在服务器端记录信息确定用户身份的。

session是一个存在服务器上的类似于一个散列表格的文件。里面存有我们需要的信息,在我们需要用的时候可以从里面取出来。类似于一个大号的map,里面的键存储的是用户的sessionid,用户向服务器发送请求的时候会带上这个sessionid。这是就可以从中取出对应的信息了。

  • 实现机制:Session 的实现常常依赖于 Cookie 机制,通过 Cookie 机制回传 SessionID;

  • 大小限制:Cookie 有大小限制并且浏览器对每个站点也有 cookie 的个数限制,Session 没有大小限制,理论上只与服务器的内存大小有关;

  • 安全性:Cookie 存在安全隐患,通过拦截或本地文件找得到 cookie 后可以进行攻击,而 Session 由于保存在服务器端,相对更加安全;

  • 服务器资源消耗:Session 是保存在服务器端上会存在一段时间才会消失,如果 session 过多会增加服务器的压力。

既然Session 的实现常常依赖于 Cookie 机制,那么客户端禁止 cookie,session 还能用吗?

一般默认情况下,在会话中,服务器存储 session 的 sessionid 是通过 cookie 存到浏览器里。如果浏览器禁用了 cookie,浏览器请求服务器无法携带 sessionid,服务器无法识别请求中的用户身份,session 失效。

  • 通过 url 重写,把 sessionid 作为参数追加的原 url 中,后续的浏览器与服务器交互中携带 sessionid 参数。

  • 服务器的返回数据中包含 sessionid,浏览器发送请求时,携带 sessionid 参数。

  • 通过 Http 协议其他 header 字段,服务器每次返回时设置该 header 字段信息,浏览器中 js 读取该 header 字段,请求服务器时,js 设置携带该 header 字段。

IP协议

路由器和交换机

交换机:

交换机拥有一条高带宽的背部总线和内部交换矩阵。交换机的所有端口都挂接在这条背部总线上。当控制电路接收到数据包以后,处理端口会查找内存中的地址对照表以确定目的MAC(网卡的硬件地址)的NIC挂接在哪个接口上,通过内部交换矩阵迅速将数据包传送到目的端口若目的MAC不存在,交换机才广播到所有端口,接收端口回应后,交换机会“学习”新的地址,并把它加入内存地址表中。

交换机工作于OSI参考模型的数据链路层。交换机内部的CPU会在每个端口成功连接时学习它的MAC地址,保存一张MAC地址表。在今后的通讯中,发往该MAC地址的数据包将仅送往其对应的端口,而不是所有端口。

路由器:

路由器(Router)是一种计算机网络设备,提供了路由和转送两种重要机制。决定数据包从源端到目的端所要经过的路由路径(host到host之间的传输路径),这个过程称为路由;将路由器输入端的数据包传送到适当的路由器输出端(在路由器内部进行),这称为转送。路由工作在OSI模型的网络层,例如网际协议。

IP

定义

IP是32位二进制数据,通常以十进制表示,并每8为二进制以“.”分隔。IP地址是一种逻辑地址,用来标识网络中的一个个主机,IP有唯一性,即每台机器的IP在全世界是唯一的。

像是一个电话号码0515163,号码中前四位表示该电话属于哪个地区,后面的数字表示该地区的某个电话号码。IP地址与之类似,我们把IP地址分成两个部分,分别为网络标识和主机标识,即IP 地址 = 网络地址 + 主机地址。例如,盐城市信息网络中央的服务器的IP地址为210.73.140.2

网络标识:210.73.140.0
主机标识:     2        
合起来写:210.73.140.2

由于网络中包含的计算机有可能不一样多,有的网络可能包含较多的计算机,有的网络包含较少的计算机,于是按照网络规模的大小,把32位地址信息设成三种定位的划分方式,分别是A类、B类、C类。

  • A类:1字节网络地址+3字节主机地址,网络地址最高位必须是“0”,网络标识长度为7位(8-1),主机标识长度为24位。网络地址数据较少,可用于主机数达1600万台的大型网络;
  • B类:2字节网络地址+2字节主机地址,网络地址最高位必须是“10”,网络标识长度为14位(2*8-2),主机标识长度为16位。网络地址适用于中等规模的网络,每个网络能容纳6万多台计算机;
  • C类:3字节网络地址+1字节主机地址,网络地址最高位必须是“110”,网络标识长度为21位(3*8-3),主机标识长度为8位。网络地址数目较多,适用于小规模的局域网络,每个网络最多只能包含254台计算机

 

 

 内网IP和外网IP

1. 内网IP

 

 

 由图可以看到路由器(第一层),交换机(第二层),然后是自己的电脑,所谓的内网就是从路由器以下开始的。我们内网用户的电脑都是经过交换机和路由器之后才能连到外网的。

内网IP局域网,网线都是连接在同一个交换机上的,也就是说它们的IP地址是由交换机或者路由器进行分配的。而且每一个IP是不同的,并且这些连接在同一个路由器上的电脑都可以通过Internet连接共享的。

路由器只需一个公网IP就可以供下面多个电脑联网使用。

2. 外网IP(公网IP)

  • 公网IP具有世界范围的唯一性,而内网IP只在局域网内部具有唯一性。一个局域网里的所有电脑的内网IP都互不相同,但共用一个外网IP
  • 在局域网中,每台电脑都可以自己分配自己的IP,但是这个IP只能在局域网中有效。而如果你将电脑连接到互联网,你的网络提供商的服务器会为你分配一个IP地址,这个IP地址才是你在外网的IP。两个IP同时存在,一个对内,一个对外。
  • 互联网上的IP(即外网IP)地址统一由一个叫“IANA”(InternetAssigned NumbersAuthority,互联网网络号分配机构)的组织来管理。由于分配不合理以及IPv4协议本身存在的局限,现在互联网的IP地址资源越来越紧张。IANA将A/B/C类IP地址的一部分保留下来留作局域网使用。具体如下:

  IP地址空间:

       a类网
       10.0.0.0~10.255.255.255
      b类网
       172.16.0.0~172.31.255.255
      c类网
       192.168.0.0~192.168.255.255

  也就是说,如果你查到的ip地址在以上A、B、C类IP地址的范围内,它一定就是局域网的ip地址,否则就是公网的地址。

例如: 如图,假如我们的计算机现在就是设备一,现在想要访问百度,如果我们正在使用着校园网,那么首先需要先通过校园网的路由器把我们的内网IP转为校园网的外网IP,然后再通过这个外网IP先连接上湖南电信的网关,最后再连接上百度的网关。百度把你请求的信息回传到你学校的网关,校园网络再把信息传给你。

 

静态IP和动态IP

区别:

    1、动态 IP 需要在连接网络时自动获取 IP 地址以供用户正常上网,而静态 IP 是 ISP 在装机时分配给用户的 IP 地址,可以直接连接上网,不需要获取 IP 地址。

    2、静态 IP 是可以直接上网的 IP 段,该 IP 在 ISP 装机时会划分一个 IP 地址给你,让计算机在连接网络时不再自动获取网络地址,避免了网络连接上的困扰。

    使用:

    1、动态 IP 上网,又叫做 DHCP 上网。自动获取 IP 上网。动态 IP 这种上网方式,在未使用路由器的情况下,只需要把这根宽带网线连接到电脑上,电脑上的 IP 地址设置为自动获得,电脑就可以实现上网了。

    2、静态 IP 上网,又叫做固定 IP 地址上网。这种上网方式,宽带运营商会提供一根网线,这跟网线提供固定的 IP 地址、子网掩码、网关和 DNS 服务器地址给用户。在未使用路由器的情况下,只需要把这根入户网线连接到电脑上,并且手动设置电脑上的 IP 地址,这样电脑才能上网。

 子网掩码

 子网掩码是用来判断任意两台计算机的ip地址是否属于同一子网络的根据。最为简单的理解就是两台计算机各自的ip地址与子网掩码进行&运算后,得出的结果是相同的,则说明这两台计算机是处于同一个子网络上的,可以进行直接的通讯。

子网掩码的作用是设定网断范围的。255.255.255.0 是一标准的 C 类地址的子掩码,255.255.0.0 是一个标准的 B 类地址子掩码。他们两个限定了完全不同的IP地址范围。C类的子掩码每个网段最大可以有256个IP地址,其中254可用(2的主机位数次方-2,因为主机号全为1时表示该网络广播地址,全为0时表示该网络的网络号,这是两个特殊地址。),B类子掩码每个网段最大可以有65536 个 IP 地址,其中 65534 个可用。

例如,

子网掩码设置成了255.255.255.128就意味着把192.168.1.0这个网段分成了两个子网,其实就是最后的8位的第一位来借用设定网络号了,所以划分成2^1个子网

192.168.1.1-126 子网号192.168.1.0
192.168.1.129-254 子网号192.168.1.128
其实子网掩码和相应的ip地址相与就是子网号了

网关

网关是指连接两个不同的网络(不同网段或不同接口协议类型)的设备,所以它又称网间连接器、协议转换器。网关不特指某一种设备,路由器很显然能够实现网关的功能,三层交换机、防火墙、服务器等也可以作为网关来使用。

在没有路由器的情况下,两个网络之间是不能进行TCP/IP通信的,因为PC和二层交换机不具备路由寻址能力,要实现这两个网络之间的通信,则必须通过网关。一台主机可以有多个网关,默认网关的意思是一台主机如果找不到可用的网关,就把数据包发给默认指定的网关,由这个网关来转发数据包,所以一般在计算机上我们将路由器地址设为默认网关

要实现这两个网络之间的通信,必须通过网关。如果网络A中的主机发现数据包的目的主机不在本地网络中,就会把数据转发给自己的网关,再由网关转发给B网络的网关,网络B的网关再转发给网络B的某个主机。

在传统TCP/IP术语中,网络设备只分为两种,一种为网关(gateway),另一种为主机(host)。网关能在网络间转送数据包,但主机不能转送数据包。

在现代网络术语中,网关(gateway)与路由器(router)的定义不同。网关(gateway)能在不同协议间移动数据,而路由器(router)是在不同网络间移动数据,相当于传统所说的IP网关(IP gateway)。

DNS服务器

DNS 是指:域名服务器 (Domain Name Server)。在 Internet 上域名与 IP 地址之间是一一对应的,域名虽然便于人们记忆,但机器之间只能互相认识 IP 地址,它们之间的转换工作称为域名解析,域名解析需要由专门的域名解析服务器来完成,DNS就是进行域名解析的服务器 。

MAC地址

MAC(Medium/Media Access Control,介质访问控制)MAC 地址是收录在 NetworkInterfaceCard(网卡 NIC) 里的.MAC 地址 , 也叫硬件地址 , 是由 48 比特 /bit 长(6 字节 /byte,1byte=8bits),16 进制的数字组成。前24位叫做组织唯一标识符(Organizationally Unique Identifier, 即 OUI),是识别LAN(局域网)节点的标识。后24位是由厂家自己分配。网卡的物理地址通常是由网卡生产厂家烧入网卡EPROM(一种闪存芯片,通常可以通过程序擦写),它存储的是传输数据时真正赖以标识发出数据和接收数据的主机地址。在网络底层的物理传输过程中,是通过物理地址来表示主机的,是全球唯一的。在OSI7层网络协议(物理层,数据链路层,网络层,传输层,会话层,表示层,应用层)参考模型中,MAC对应于第二层数据链路层,而IP对应于网络层

MAC 地址与 IP 地址的区别:

有人曾这么比喻,你已经有了手机号,为什么还要一个身份证号呢?你的身份证号是你唯一标识号,只要有这个号码就能找的到你。但是你的朋友为什么不用身份证找你而是用手机号呢?方便不是。但是你要是犯了罪,警察用你手机号找你,你换了号怎么办?那不就得用你的身份证号才能逮到你了?

也就是说IP地址是可以改变的,而MAC地址是每个主机的物理地址,是唯一的不可改变的。

使用IP地址和MAC地址进行标识的优点:

1.IP 地址的分配是根据网络的拓朴结构,而不是根据谁制造了网络设置。若将高效的路由选择方案建立在设备制造商的基础上而不是网络所处的拓朴位置基础上,这种方案是不可行的。

2. 当存在一个附加层的地址寻址时,设备更易于移动和维修。例如,如果一个以太网卡坏了,可以被更换,而无须取得一个新的 IP 地址。如果一个 IP 主机从一个网络移到另一个网络,可以给它一个新的 IP 地址,而无须换一个新的网卡。

3.无论是局域网,还是广域网中的计算机之间的通信,最终都表现为将数据包从某种形式的链路上的初始节点出发,从一个节点传递到另一个节点,最终传送到目的节点。数据包在这些节点之间的移动都是由 ARP(Address Resolution Protocol:地址解析协议)负责将 IP 地址映射到 MAC 地址上来完成的。

ARP协议工作原理:

    首先,每个主机都会在自己的 ARP 缓冲区中建立一个 ARP 列表,以表示 IP 地址和 MAC 地址之间的对应关系。当源主机要发送数据时,首先检查 ARP 列表中是否有对应 IP 地址的目的主机的 MAC 地址如果有,则直接发送数据,如果没有,就向本网段的所有主机发送 ARP 数据包,该数据包包括的内容有:源主机 IP 地址,源主机 MAC 地址,目的主机的 IP 地址。

    当本网络的所有主机收到该 ARP 数据包时,首先检查数据包中的 IP 地址是否是自己的 IP 地址,如果不是,则忽略该数据包,如果是,则首先从数据包中取出源主机的 IP 和 MAC 地址写入到 ARP 列表中,如果已经存在,则覆盖,然后将自己的 MAC 地址写入 ARP 响应包中,告诉源主机自己是它想要找的 MAC 地址。

    源主机收到 ARP 响应包后。将目的主机的 IP 和 MAC 地址写入 ARP 列表,并利用此信息发送数据。如果源主机一直没有收到 ARP 响应数据包,表示 ARP 查询失败

    如果目标 IP 与自己不在同一个网段,这种情况需要将包发给默认网关,所以主要获取网关的 MAC 地址。如果 arp 高速缓存有默认网关的 MAC 地址,直接发送 IP 数据报到默认网关,再由网关转发到外网;如果 arp 高速缓存没有默认网关的 MAC 地址,还是发送 ARP 广播请求默认网关的 MAC 地址,缓存该地址,并且发送数据报到网关。

TCP协议

TCP和UDP的区别

TCP

优点:可靠,稳定。TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源

缺点:慢,效率低,占用系统资源高,易被攻击。TCP在传递数据之前,要先建立连接,这会消耗时间,而且在数据传递时,确认机制、重传机制、拥塞控制机制等都会消耗大量的时间,而且要在每台设备上维护所有的传输连接。事实上,每个连接都会占用系统CPU、内存等硬件资源。而且,因为TCP有确认机制、三次握手机制,这些也导致TCP容易被人利用,实现DDOS、CC等攻击。

总结:

  • 面向连接
  • 每一条TCP连接只能是点对点的(一对一)。
  • 提供可靠交付的服务(无差错,不丢失,不重复,且按序到达)(校验和、重传控制、序号标识、滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制)。
  • 提供全双工通信
  • 面向字节流

UDP

优点:快,比TCP稍安全,UDP没有TCP握手,确认,窗口,重传,拥塞控制等机制,UDP是一个无状态的传输协议,所以它在传递数据时非常快。没有TCP这些机制,UDP较TCP被攻击者利用的漏洞就要少一些。但UDP也是无法避免攻击的,比如:UDP Flood攻击。。。

缺点:不可靠,不稳定。因为UDP没有TCP那些可靠的机制,在数据传递时,如果网络质量不好,就会很容易丢包。

总结:

  • 无连接
  • 尽最大努力交付(不保证可靠交付)
  • 面向报文
  • 无拥塞控制
  • 支持一对一、一对多、多对一和多对多的交互通信
  • 首部开销小(只有四个字段:源端口、目的端口、长度、校验和)

使用场景

使用TCP:当对网络通讯质量有要求的时候,比如:整个数据要准确无误地传递给对方,这往往用于一些要求可靠的应用,比如HTTP、HTTPS、FTP等传输文件的协议,POP、SMTP等邮件传输的协议

使用UDP:当对网络通讯质量要求不高的时候,要求网络通讯速度尽量的快,这时就可以使用UDP。比如,日常生活中,常见使用UDP协议的应用如下:QQ语音QQ视频

TCP协议实现可靠传输的方式

方式概览

  • 应用数据被分割成TCP认为最适合发送的数据块
  • TCP给发送的每一个包编号,接收方对数据包进行排序,把有序数据传送给应用层。
  • 校验和:TCP将保持它首部和数据的校验和。这是一个端到端的校验和,目的是检测数据再传输过程中的任何变化。如果收到段的检测和有差错,TCP将丢弃这个报文段和不确认收到此报文段。
  • TCP的接收端会丢弃重复的数据。
  • 流量控制
  • 拥塞控制:当网络拥塞时,减少数据的发送。
  • ARQ协议(自动重传请求):也是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组。
  • 超时重传:当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段,如果不能及时收到一个确认,将重发这个报文段。

流量控制

TCP连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率防止包丢失。TCP使用的流量控制协议是可变大小的滑动窗口协议。(TCP利用滑动窗口实现流量控制)。

在TCP协议当中窗口机制分为两种:

  • 固定的窗口大小
  • 滑动窗口

固定窗口存在的问题:

  • 如果窗口过小,当传输比较大的数据的时候需要不停的对数据进行确认,这个时候就会造成很大的延迟。
  • 如果窗口过大,我们假设发送方一次发送100个数据,但接收方只能处理50个数据,这样每次都只对这50个数据进行确认。发送方下一次还是发送100个数据,但接收方还是只能处理50个数据。这样产生了不必要的数据来拥塞我们的链路。(也就是发送方能发送的数据范围和接收方能接受的数据范围不对等,发送方窗口过大,接收方窗口较小)

因此引入滑动窗口:“窗口”对应的是一段可以被发送者发送的字节序列,其连续的范围称之为“窗口”;“滑动”则是指这段“允许发送的范围”是可以随着发送的过程而变化的,方式就是按顺序“滑动”。发送方根据这个数据来计算自己最多能发送多长的数据,如果发送方收到接收方的窗口大小为0的TCP数据包,那么发送方将停止发送数据,等到接收方发送窗口大小不为0的数据包到来。

1)对于TCP会话的发送方,任何时候在其发送缓存内的数据都可以分为4类

  • “已经发送并得到对端ACK的”
  • “已经发送但还未收到对端ACK的”
  • “未发送但对端允许发送的”
  • “未发送且对端不允许发送”

“已经发送但还未收到对端ACK的”和“未发送但对端允许发送的”这两部分数据称之为发送窗口(中间两部分)。

 

 2)对于TCP的接收方,在某一时刻在它的接收缓存内存在3种。

  • “已接收”
  • “未接收准备接收”
  • “未接收并未准备接收”(由于ACK直接由TCP协议栈回复,默认无应用延迟,不存在“已接收未回复ACK”)。

其中“未接收准备接收”称之为接收窗口。

拥塞控制

计算机网络中的带宽、交换结点中的缓存及处理机等都是网络的资源。在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就会变坏,这种情况就叫做拥塞。拥塞控制就是防止过多的数据注入网络中,这样可以使网络中的路由器或链路不至过载。注意,拥塞控制和流量控制不同,前者是一个全局性的过程,而后者指点对点通信量的控制。拥塞控制的方法主要有以下四种:

  • 慢启动:不要一开始就发送大量数据,先探测一下网络的拥塞程度,也就是说由小到大逐渐增加拥塞窗口的大小
  • 拥塞避免:拥塞避免算法让拥塞窗口缓慢增长,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍,这样拥塞窗口按线性规律缓慢增长
  • 快重传:快重传要求接收方在收到一个失序的报文段后就立即发出重复确认(为的是使发送方及早知道有报文段没有到达对方)而不要等到自己发送数据时捎带确认。快重传算法规定,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等到设置的重传计时器时间到期。
  • 快恢复:快重传配合使用的还有快恢复算法,当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把ssthresh门限减半,但是接下去并不执行慢开始算法:因为如果网络出现拥塞的话就不会收到好几个重复的确认,所以发送方现在认为网络可能没有出现拥塞,所以此时不执行慢开始算法,而是将cwnd设置为新的ssthresh大小,然后执行拥塞避免算法

 

 ARQ协议https://www.cnblogs.com/blythe/articles/7348812.html

自动重传请求(Automatic Repeat-reQuest,ARQ)是OSI模型中的数据链路层和传输层错误纠正协议之一。它通过使用确认和超时这两个机制,在不可靠服务的基础上实现可靠的信息传输。如果发送方在发送后一段时间之内没有收到确认帧,它通常会重新发送。ARQ包括停止等待和连续ARQ协议。

停止等待ARQ协议

停止等待协议是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送等待对方确认(回复ACK)。如果过了一段时间(超时后),还是没有收到ACK确认,说明没有发送成功,需要重新发送,直到收到确认后再发下一个分组;在停止等待协议中,若接收方收到重复分组,就丢弃该分组,但同时还要发送确认

连续ARQ协议

连续ARQ协议可提高信道利用率。发送方维持一个发送窗口,凡位于发送窗口内的分组可以连续发送出去,就不需要等到对方确认。接收方一般采用累计确认,对按序到达的最后一个分组发送确认,表明到这个分组为止的所有分组都已经正确收到了。解决连续ARQ的差错恢复有两种基本方法:回退N步(Go-Back-N, GBN)和选择重传

N常被称为窗口长度,GBN协议常被称为滑动窗口协议。

GBN协议和选择重传协议以及滑动窗口大小问题https://blog.csdn.net/Mr_J0304/article/details/89599086

 

TCP三次握手和四次挥手

在这之前,先了解TCP首部的含义:

  • 序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号seq就是这个报文段中的第一个字节的数据编号
  • 确认号ack:占4个字节,期待收到对方下一个报文段的第一个数据字节的序号;序列号表示报文段携带数据的第一个字节的编号;而确认号指的是期望接收到下一个字节的编号;因此当前报文段最后一个字节的编号+1即为确认号
  • 确认ACK:占1位,仅当ACK=1时,确认号字段才有效。ACK=0时,确认号无效
  • 同步SYN:连接建立时用于同步序号。当SYN=1,ACK=0时表示:这是一个连接请求报文段。若同意连接,则在响应报文段中使得SYN=1,ACK=1。因此,SYN=1表示这是一个连接请求,或连接接受报文。SYN这个标志位只有在TCP建产连接时才会被置1,握手完成后SYN标志位被置0
  • 终止FIN:用来释放一个连接。FIN=1表示:此报文段的发送方的数据已经发送完毕,并要求释放运输连接

    PS:ACK、SYN和FIN这些大写的单词表示标志位,其值要么是1,要么是0;ack、seq小写的单词表示序号。

 

 三次握手

所谓三次握手,即TCP连接的建立。这个连接必须是一方主动打开,另一方被动打开的。

(1)首先客户端想服务器发送一段TCP报文,其中:

  • 标记位为SYN,表示“请求建立新连接”
  • 序号为seq = x (x一般为1)
  • 随后客户端进入SYN-SENT阶段

(2)服务器端接收到来自客户端的TCP报文之后,结束LISTEN阶段。并返回一段TCP报文,其中:

  • 标志位为SYN和ACK,表示“确认客户端的报文seq序号有效,服务器能正常接收客户端发送的数据,并同意创建新连接”(即告诉客户端,服务器收到了你的数据);
  • 序号为seq = y
  • 确认号为ack = x + 1,表示收到客户端的序号seq并将其加1作为自己确认号ack的值。随后服务器进入SYN-RCVD阶段

(3)客户端接收到来自服务器的确认收到数据的TCP报文段之后,明确了从客户端到服务器的数据传输是正常的,结束SYN-SENT阶段。并返回最后一段TCP报文。其中:

  • 标志位为ACK,表示“确认收到服务器端同意连接的信号”(即告诉服务器,我知道你收到我发的数据了)
  • 序号为seq = x + 1,表示收到服务器端的确认号ack,并将其值作为自己的序号值
  • 确认号ack = y + 1,表示收到服务器端序号seq,并将其值加1作为自己的确认号ack的值
  • 随后客户端进入ESTABLISHED阶段。

服务器收到来自客户端的“确认收到服务器的数据”的TCP报文之后,明确了从服务器到客户端的数据传输是正常的。结束SYN-SENT阶段,进入ESTABLISHED阶段。

四次挥手

所谓四次挥手,即TCP连接的释放(解除)。连接的释放必须是一方主动释放,另一方被动释放。

 

挥手之前主动释放连接的客户端结束ESTABLISHED阶段,随后开始“四次挥手”: 

(1)首先客户端想要释放连接,向服务器发送一段TCP报文,其中:

  • 标记位为FIN,表示“请求释放连接”
  • 序号为seq = u
  • 随后客户端进入FIN-WAIT-1阶段,即半关闭阶段。并且停止在客户端到服务器端方向上发送数据,但是客户端仍然能接收从服务器端传输过来的数据(注意:这里不发送的是正常连接时传输的数据(非确认报文),而不是一切数据,所以客户端仍然能发送ACK确认报文)。

(2)服务器端接收到从客户端发出的TCP报文后,确认了客户端想要释放连接,随后服务器端结束ESTABLISHED阶段,进入CLOSE-WAIT阶段(半关闭状态)并返回一段TCP报文,其中:

  • 标记位为ACK,表示“接收到客户端发送的释放连接的请求”
  • 序号为seq = v
  • 确认号为ack = u + 1,表示是在收到客户端报文的基础上,将其序号值加1作为本段报文确认号ack的值
  • 随后服务器开始准备释放服务器到客户端方向上的连接

前两次挥手既让服务器知道了客户端想要释放连接,也让客户端知道了服务器端了解了自己想要释放连接的请求。于是,可以确认关闭客户端到服务器端方向上的连接了。

(3)服务器端自从发出ACK确认报文之后,经过CLOSED-WAIT阶段,做好了释放服务器端到客户端方向上的连接准备,再次想客户端发出一段TCP报文,其中:

  • 标记位为FIN,ACK,表示“已经准备好释放连接了”。注意:这里的ACK并不是确认收到服务器端报文的确认报文。
  • 序号为seq = w
  • 确认号为ack = u + 1,表示是在收到客户端报文的基础上,将其序号值加1作为本段报文确认号的值

随后服务器结束CLOSE-WAIT阶段,进入LAST-ACK阶段。并且停止在服务端到客户端方向上发送数据,但是服务器端仍然能够接收从客户端传输过来的数据。

(4)客户端收到从服务器端发出的TCP报文,确认了服务器端已经做好释放连接的准备,结束FIN-WAIT-2阶段,进入TIME-WAIT阶段,并向服务器发送一段报文,其中:

  • 标记位为ACK,表示“接收到服务器准备释放连接的信号”
  • 序号为seq = u + 1,表示是在收到了服务器端报文的基础上,将其确认号ack值作为本段报文序号的值
  • 确认号ack = w + 1,表示是在收到了服务器端报文的基础上,将其序号值加1作为本段报文序号的值

随后客户端开始在TIME-WAIT等待2MSL

服务器端收到从客户端发出的TCP报文之后结束LAST-ACK阶段,进入CLOSED阶段。由此正式确认关闭服务器端到客户端方向上的连接。

客户端等待完2MSL(最大报文段生存时间)之后,结束TIME-WAIT阶段,进入CLOSED阶段,由此完成“四次挥手”。

后“两次挥手”既让客户端知道了服务器端准备好释放连接了,也让服务器端知道了客户端了解了自己准备好释放连接了。于是,可以确认关闭服务器端到客户端方向上的连接了,由此完成“四次挥手”。

与“三次挥手”一样,在客户端与服务器端传输的TCP报文中,双方的确认号Ack和序号Seq的值,都是在彼此Ack和Seq值的基础上进行计算的,这样做保证了TCP报文传输的连贯性,一旦出现某一方发出的TCP报文丢失,便无法继续"挥手",以此确保了"四次挥手"的顺利完成。

常见问题:

1. 第3次握手失败会怎么办?

第三次失败,只有客户端处于成功状态(因为第二次服务器返回了ACK),服务器端没有接收到客户端的ACK。

这要分几种情况讨论:

  • 客户端发出的ACK丢失了,发出的下一个数据包没有丢失,则服务器端接收到这个数据包(数据包里也会带上ACK信息),能够进入正常的ESTABLISHED状态
  • 如果服务器端和客户端没有数据发送,或者服务器端想发送数据(但是发不了,因为没有收到客户端ACK),服务器都会有定时器发送第二步SYN+ACK数据包,如果客户端再次发送ACK成功建立连接
  • 如果一直不成功,服务器肯定会有超时设置,超时之后会给客户端发RTS报文,进入CLOSED状态,防止SYN洪泛攻击。

2. 为什么TCP连接需要三次握手,两次不可以吗?为什么?

(1)TCP的三次握手最主要是防止已过期的连接再次传到被连接的主机。

客户端发出的连接请求报文并未丢失,而是在某个网络结点长时间滞留了,已致延误到连接请求释放以后的某个时间才到达Server。这时,Server误以为这时Client发出的一个新的连接请求,于是就向客户端发送确认数据包,同意建立连接。

  • 若不采用“三次握手”,那么只要Server发出确认数据包,新的连接就建立了。Server就会等待着Client传东西过去,浪费了一定的资源。
  • 若采用“三次握手”,在这种情况下,由于Server端没有收到来自客户端的确认,则就会知道Client并没有要求建立连接,就不会建立连接。

(2)最重要的原因是客户端和服务端两方都要知道对方的序列号,才知道下一次要请求的位置从哪里开始。否则就不会有超时重传等机制。

3. 为什么连接的时候是三次握手,关闭的时候却是四次挥手?

TCP是全双工模式,Server和Client都既可以是发送方也可以是接收方,而不是单纯的由Client给Server发数据。

连接的的时候,Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中SYN表示Server同意建立连接;ACK表示Server收到了Client的请求。

但是关闭的时候,当Server收到FIN报文时,很可能不会立即关闭连接,所以只能先回复一个ACK报文,告诉Client,“你发的FIN报文我收到了”。只有等到Server所有的报文都发送完了,才会发送FIN报文,因为不能一起发送,故需要四次挥手。

4. 为什么客户端在TIME-WAIT阶段要等2MSL?

为的是确认服务器端是否收到客户端发出的ACK确认报文。

当客户端发出最后的ACK确认报文时,并不能确定服务器能够收到该段报文,所以客户端在发送完ACK确认报文之后,会设置一个时长为2MSL的计时器。MSL指的是Maximum Segment Lifetime:一段TCP报文在传输过程中的最大生命周期。2MSL即是服务器端发出为FIN报文和客户端发出的ACK确认报文所能保持的有效的最大时长。

服务器端在1MSL内没有收到客户端发出的ACK确认报文,就会再次向客户端发出FIN报文(这个过程的最大时长也是1MSL,所以要为这两个过程预留足够的时间,即2MSL)

  • 如果客户端在2MSL内,再次收到了来自服务器端的FIN报文,说明服务器端由于各种原因没有收到客户端发出的确认报文。客户端再次向服务器端发出ACK确认报文,计时器重置,重新开始2MSL的计时。
  • 否则客户端在2MSL内没有收到来自服务器端的FIN报文,说明服务器端正常接收了ACK的确认报文,客户端可以进入CLOSED阶段,完成“四次挥手”。

所以客户端要经历时长为2MSL的TIME-WAIT阶段,这也是为什么客户端比服务器端晚进入CLOSED阶段的原因。

5. 如果已经建立了连接,但是客户端突然出现故障了怎么办?

TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

HTTP协议

HTTP

定义

HTTP是 HyperText Transfer Protocol的缩写,译为超文本传输协议。是一种应用于OSI七层模型中应用层的协议,是我们平常互联网网络通信传输的基础。它的作用就是规定了服务器和客户端之间的建立连接,请求数据,响应数据,关闭连接(HTTP的连接和断开基于TCP的三次握手和四次挥手)。HTTP使用TCP而不是UDP的原因在于打开一个网页必须传送很多数据,而TCP协议提供传输控制,按顺序组织数据和错误纠正。

HTTP的优化

主要是针对连接无法复用和head of line blocking问题的优化。

HTTP协议的瓶颈机器优化技巧都是基于TCP协议本身的特性。如TCP建立连接时三次握手有1.5RTT的延迟,为了避免每次请求都经历握手带来的延迟,应用层会选择不同策略的http长连接方案。又如TCP在建立连接时的初期有慢启动的特性,所以连接的重用总是比新建连接性能要好。

  • 图中第一种请求方式,就是单次发送请求,收到相应后再进行下一次请求,显然是低效的。针对这种情况,http1.1提出了pipelining技术(pipelining技术也是为了解决head of line blocking,只是没有完全解决),图中第二个,一次性发送多个请求。
  • 然而pipelining在接收response返回时,也必须依顺序接收,如果前一个请求遇到了阻塞,后面的请求即使已经处理完毕了,也需要等待阻塞的请求处理完毕。如图第三个,第一个请求阻塞后,后面的请求都需要等待,这也就是队头阻塞(Head of line blocking)。为了解决这个问题,http2.0提出了多路复用,将多个请求复用同一个tcp连接中,将一个tcp连接分为若干个流,每个流可以传输若干信息,每个消息由若干最小的二进制帧组成。也就是将每个request-response拆分为细小的二进制帧Frame,这样即使一个请求被阻塞了,也不会影响其他请求,如图第4种情况。

原文链接:https://www.jianshu.com/p/450cc7320e30

HTTP连接使用的是“请求-响应”的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据。HTTP/1.0是第一个在通讯中指定版本号的HTTP协议版本,至今仍被广泛采用,特别是在代理服务器中。HTTP/1.1是当前版本,持久连接被默认采用。并能很好地配合代理服务器工作,还支持以管道方式同时发送多个请求,以便降低线路负载,提高传输速度。HTTP/2.0在HTTP/1.X的基础上,大幅度的提高了web性能,减少了网络延迟。HTTP1.0和1.1在之后很长的一段时间内会一直并存,这是由于网络基础设施更新缓慢锁决定的。

 

HTTP1.0和HTTP1.1的区别

1. 长连接

HTTP1.0需要使用keep-alive参数来告知服务器要建立一个长连接,而HTTP1.1默认支持长连接

HTTP是基于TCP/IP协议的,创建一个TCP连接时需要经过三次握手的,有一定的开销,如果每次通讯都要重新建立连接的话,对性能有影响。因此最好能维持一个长连接,可以用一个长连接来发多个请求。

如果client使用HTTP1.1协议,但又不希望使用长连接,则需要在header中指明connection的值为close;如果server方也不想支持长连接,则在response中也需要说明connection的值为close。不论request还是response的header中包含了值为close的connection,都表明当前正在使用的tcp链接在当天请求处理完毕后会被断掉。以后client再进行新的请求时就必须创建新的tcp链接了。

2. 节约带宽

HTTP1.1支持只发送header信息(不带任何body信息),如果服务器认为客户端有权限请求服务器,则返回100,否则返回401。客户端如果接受到100,才开始把请求body发送到服务器。这样当服务器返回401的时候,客户端就可以不用发送请求body了,节约了带宽。

HTTP1.0不支持文件断点续传,<code>RANGE:bytes</code>是HTTP1.1新增内容,HTTP1.0每次传送文件都是从文件头开始,即0字节处开始。<code>RANGE:bytes=xxxx</code>表示要求服务器从文件xxxx字节处开始传送。

3. HOST域

HTTP1.1通过增加更多的请求头和响应头来改进和扩充HTTP1.1的功能HTTP1.0是不支持HOST请求头字段的,WEB浏览器无法使用主机头名来明确表示要访问服务器上的哪个WEB站点,这样就无法使用WEB服务器在同一个IP地址和端口号上配置多个虚拟WEB站点。在HTTP 1.1中增加Host请求头字段后,WEB浏览器可以使用主机头名来明确表示要访问服务器上的哪个WEB站点,这才实现了在一台WEB服务器上可以在同一个IP地址和端口号上使用不同的主机名来创建多个虚拟WEB站点

HTTP 1.1还提供了与身份认证状态管理Cache缓存等机制相关的请求头和响应头。
HTTP/1.0不支持文件断点续传,<code>RANGE:bytes</code>是HTTP/1.1新增内容,HTTP/1.0每次传送文件都是从文件头开始,即0字节处开始。<code>RANGE:bytes=XXXX</code>表示要求服务器从文件XXXX字节处开始传送,这就是我们平时所说的断点续传!
4. 错误通知的管理
HTTP1.1中新增了24个错误状态相应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性地删除。
 
HTTP2.0
1. 多路复用
多路复用允许同时通过单一的HTTP2.0连接发起多重的请求-相应消息。
在HTTP1.1协议中浏览器客户端在同一时间,针对同一域名下的请求有一定数量限制,超过限制数目的请求会被阻塞。而HTTP2.0的多路复用则允许通过单一的连接发起多重的请求-相应消息。因为HTTP2.0可以很容易的去实现多流并行而不用依赖建立多个TCP连接,HTTP2.0把HTTP协议通信的基本单位缩小为一个一个的帧,这些帧对应着逻辑流中的消息,并行地在同一个TCP连接上双向交换信息。
2. 二进制分帧
HTTP2.0在应用层(HTTP2.0)和传输层(TCP or UDP)之间增加一个二进制分帧层。在不改动HTTP1.X的语义、方法、状态码、URI以及首部字段的情况下,解决了HTTP1.1的性能限制,改进传输性能,实现低延迟和高吞吐量。在二进制分帧层中,HTTP2.0会将所有传输的信息分割成更小的消息和帧,并对它们采用二进制格式的编码,其中HTTP1.x的首部信息会被封装到HEADER frame,而相应的Request Body则封装到DATA frame里面。
3. 首部压缩
HTTP1.1不支持header数据的压缩,HTTP2.0使用HPACK算法对header的数据进行压缩,这样数据体积小了,在网络上传输就会更快。
4. 服务端推送 (这篇文章写得挺明白的https://www.ruanyifeng.com/blog/2018/03/http2_server_push.html
服务器推送是一种在客户端请求之前发送数据的机制(还没有收到浏览器的请求,服务器就把各种资源推送给浏览器)。
在HTTP2.0中,服务器可以对客户端的一个请求发送多个响应。Server Push 让HTTP1.x时代使用内嵌资源的优化手段变得没有意义。比如,浏览器只请求了index.html,但是服务器把index.htmlstyle.cssexample.png全部发送给浏览器。这样的话,只需要一轮 HTTP 通信,浏览器就得到了全部资源,提高了性能。
服务器可以缓存,并且在遵循同源的情况下,不同页面之间可以共享缓存。此当客户端需要的数据已缓存时,客户端直接从本地加载这些资源就可以了,不用走网络,速度自然是快很多的。
参考连接:https://www.jianshu.com/p/52d86558ca57
 
HTTP1.1请求头
https://zhuanlan.zhihu.com/p/135947893
其中Transfer-Encoding/Content-Encoding/Accept-Encoding的区别见https://blog.csdn.net/swt369/article/details/77847896
 
HTTP的幂等性
参见:https://www.cnblogs.com/weidagang2046/archive/2011/06/04/2063696.html

既然POST方法不具有幂等性,那么如何防范 POST 重复提交?

    HTTP POST 操作既不是安全的,也不是幂等的(至少在 HTTP 规范里没有保证)。当我们因为反复刷新浏览器导致多次提交表单,多次发出同样的 POST 请求,导致远端服务器重复创建出了资源

    所以,对于电商应用来说,

  • 第一、对应的后端 WebService 一定要做到幂等性

  • 第二、服务器端收到 POST 请求,在操作成功后必须返回状态码302 重定向到另外一个页面,这样即使用户刷新页面,url已经变更,不需要进行post请求,也不会重复提交表单

post方法和get方法区别

GET:从服务器上获取数据,也就是所谓的查,仅仅是获取服务器资源,不进行修改。是无副作用的,是幂等的。
POST:向服务器提交数据,这就涉及到了数据的更新,也就是更改服务器的数据。有副作用,非幂等。

GET 方法

请注意,查询字符串(名称/值对)是在 GET 请求的 URL 中发送的:

/test/demo_form.asp?name1=value1&name2=value2

有关 GET 请求的其他一些注释:

  • GET 请求可被缓存
  • GET 请求保留在浏览器历史记录中
  • GET 请求可被收藏为书签
  • GET 请求不应在处理敏感数据时使用
  • GET 请求有长度限制
  • GET 请求只应当用于取回数据

POST 方法

请注意,查询字符串(名称/值对)是在 POST 请求的 HTTP 消息主体中发送的:

POST /test/demo_form.asp HTTP/1.1
Host: w3schools.com
name1=value1&name2=value2

有关 POST 请求的其他一些注释:

  • POST 请求不会被缓存
  • POST 请求不会保留在浏览器历史记录中
  • POST 不能被收藏为书签
  • POST 请求对数据长度没有要求

 

 

HTTPS

HTTP和HTTPS的区别

  • HTTP协议运行在TCP之上,明文传输,客户端与服务器端都无法验证对方的身份;HTTPS是运行在SSL/TLS之上的HTTP协议,SSL/TLS运行在TCP之上。HTTPS是添加了加密和认证机制的HTTP。
  • HTTP的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比HTTP协议安全。
  • HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

  • 和 HTTP 通信相比,HTTPS 通信会由于加解密处理消耗更多的 CPU 和内存资源;
  • Https 通信需要证书,而证书一般需要向认证机构购买。

HTTPS 并非绝对安全,掌握根证书的机构、掌握加密算法的组织同样可以进行中间人形式的攻击,但 HTTPS 仍是现行架构下最安全的解决方案。

SSL:在 TCP 协议之上,应用层之下运作,是用来传输敏感信息的。使用 SSL 连接的 URL 地址以 https 开头,而不是 http。

SST/TLS之间的关系见:https://juejin.im/post/5b213a0ae51d4506d47dff0d

 

HTTPS加密过程

HTTPS采用对称加密非对称加密结合的方式来保护浏览器和服务器之间的通信安全。

  • 对称加密:加密和解密都是同一个密钥
  • 非对称加密:需要两个密钥:公钥和私钥。公钥和私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫做非对称加密算法。

非对称加密的密钥形式:公钥与私钥是一对。传输双方均有自己的一对密钥,也就是双方每方均有:公、私密钥一把,双方加起来共4把。

例如:传输双方比如是甲乙双方,甲方有配对的公、私密钥一对,且公钥负责加密,私钥负责解对应的公钥加的密。乙方同理。这样即使公钥被截获,也破解不了密文内容。

非对称加密的具体实现:

  • 客户端要向服务器发送信息,客户端和服务器都要产生一对用于加密和解密的公钥和私钥。
  • 客户端的私钥保密,客户端的公钥告诉服务器;服务器的私钥保密,服务器的公钥告诉客户端。
  • 客户端要给服务器发送信息时,客户端用服务器的公钥加密信息,因为服务器的公钥是公开的,客户端可以得到。
  • 客户端将消息发给服务器(已经用服务器的公钥加密消息)。
  • 服务器收到这个消息后,服务器用自己的私钥解密客户端的消息。其他所有收到这个报文的人都无法解密,,因为只有服务器才有服务器的私钥。

HTTPS加密流程:

  • 浏览器使用HTTPS的URL访问服务器,建立SSL连接。
  • 服务器接收到SSL连接后,发送非对称密钥的公钥A给浏览器
  • 浏览器生成随机数,作为对称加密的密钥B
  • 浏览器使用服务器返回的公钥A,对自己生成的对称加密密钥B进行加密,得到密钥C
  • 浏览器将密钥C发送给服务器
  • 服务器使用自己的非对称加密私钥D对接收的密钥C进行解密(D可以对C进行解密是因为C使用服务器端的公钥A进行加密的),得到对称密钥B
  • 浏览器和服务器之间使用密钥B作为对称加密密钥进行通信

之后使用对称密钥B进行信息通信是相对安全的是因为,由于这个密钥C是用服务器的公钥进行加密的,所以只能用服务器的私钥D解密,所以即使中间人截获了密钥C,也无法解密获得B。

但又是不安全的,因为在服务器给客户端发送公钥A的时候可能被中间人截获,此时中间人用自己的公钥冒充服务器的公钥发送给客户端,之后客户端会用中间人的公钥来加密自己生成的对称密钥。然后把加密的密钥发送给服务器,这时中间人又把密钥截获,用自己的私钥解密,解密后中间人就能获取对称密钥了。

注意:非对称加密之所以不安全,因为客户端不知道这把公钥是不是属于服务器的。

对称非对称相结合的优点:非对称加密只使用了一次,后续所有的通信消息都是用对称加密,效率比非对称加密高。对称加密速度快,非对称加密速度慢(相对慢100倍)。

认证中心(CA)

一个拥有公信力、大家都认可的认证中心,数字证书认证机构。

服务器在给客户端传输公钥的过程中,会把公钥和服务器的个人信息通过hash算法生成信息摘要。

为了防止信息摘要被调换,服务器会采用CA提供的私钥对信息摘要进行加密来形成数字签名。最后会把原来没Hash算法之前的个人信息、公钥、数字签名合并在一起,形成数字证书。

客户端拿到数字证书后,使用CA提供的公钥对数组证书里的数字签名进行解密来得到信息摘要,然后对数字证书里服务器的公钥及个人信息进行Hash得到另一份信息摘要。最后将两份信息摘要对比,如果一样则证明是服务器,否则就是中间人。

HTTPS的工作原理(SSL/TLS的握手过程,工作过程)

TLS旨在为Internet提供通信安全的加密协议。TLS握手是启动和使用TLS加密的通信会话的过程。在握手期间,Internet中的通信双方会批次交换信息,验证密码套件,交换会话密钥。

每当用户通过HTTPS导航到具体的网站并发送请求时,就会进行TLS握手。除此之外,每当其他任何通信使用HTTPS(包括API调用和在HTTPS上查询DNS)时,也会发生TLS握手。

TLS具体的握手过程会根据所使用的密钥交换算法的类型双方支持的密码套件而不同。

通信前,首先会进行HTTP/TCP三次握手,握手完成后,再进行TLS握手过程。

HTTPS的加密机制是一种共享密钥加密(对称加密)和公开密钥加密(非对称加密)并用的混合加密机制。

计算机网络必问面试题:https://zhuanlan.zhihu.com/p/135947893

posted on 2020-07-25 15:28  小小糖果tt  阅读(515)  评论(0)    收藏  举报