1. 计算机通信原理

1.1 OSI参考模型

把网络通信的工作分为7层,分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层
网络协议 - 图1

  1. 物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。 它的主要作用是传输比特流(就是由 1、 0 转化为电流强弱来进行传输,到达目的地后在转化为1、 0,也就是我们常说的模数转换与数模转换)。这一层的数据叫做比特。
  2. 数据链路层:把从物理层接收的数据进行 MAC 地址(网卡的地址)的封装与解封装。常把这一层的数据叫做帧。在这一层工作的设备是交换机,数据通过交换机来传输。
  3. 网络层:主要将从下层接收到的数据进行 IP 地址(例 192.168.0.1)的封装与解封装。在这一层工作的设备是路由器,常把这一层的数据叫做数据包。
  4. 传输层 :定义了一些传输数据的协议和端口号(WWW 端口 80 等),如: TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据), UDP(用户数据报协议,与 TCP 特性恰恰相反,用于传输可靠性要求不高,数据量小的数据,如 QQ 聊天数据就是通过这种方式传输的)。 主要是将从下层接收的数据分段进行传输,到达目的地址后在进行重组。常常把这一层数据叫做段。
  5. 会话层:通过传输层(端口号:传输端口与接收端口) 建立数据传输的通路。主要在你的系统之间发起会话或或者接受会话请求(设备之间需要互相认识可以是 IP 也可以是 MAC 或者是主机名)
  6. 表示层:主要是对接收的数据进行解释、加密与解密、压缩与解压缩等(也就是把计算机能够识别的东西转换成人能够能识别的东西(如图片、声音等))
  7. 应用层:主要是一些终端的应用,比如说FTP(各种文件下载), WEB(IE浏览), QQ之类的(你就把它理解成我们在电脑屏幕上可以看到的东西.就 是终端应用)。

    1.2 TCP/IP参考模型

    TCP/IP 协议不是 TCP 和 IP 这两个协议的合称,而是指因特网整个 TCP/IP 协议族。从协议分层模型方面来讲, TCP/IP 由四个层次组成:网络接口层、网络层、传输层、应用层。
    网络协议 - 图2

  8. 网路访问层(Network Access Layer):指主机必须使用某种协议与网络相连。对应着OSI参考模型的物理层和数据链路层。

  9. 网络层(Internet Layer):是整个 TCP/IP 协议栈的核心。它的功能是把分组数据发往目标网络或主机。可以完成将不同类型的网络(异构网)互连的任务。除此之外,还需要完成拥塞控制的功能。
  10. 传输层(Tramsport Layer):传输层负责在应用进程之间建立端到端的连接和可靠通信。TCP层涉及两个协议,TCP 和 UDP。TCP 协议提供面向连接的服务,提供按字节流的有序、可靠传输,可以实现连接管理、差错控制、流量控制、拥塞控制等。也就是可靠传输。UDP 协议提供无连接的服务,用于不需要或无法实现面向连接的网络应用中。也就是不可靠传输。
  11. 应用层(Application Layer):为各种网络应用提供服务。

2. 网络协议

2.1 网络协议关系图

OSI参考模型和TCP/IP模型在不同的层次中有许多不同的网络协议,如图所示:
网络协议 - 图3

2.2 IP协议

IP 协议的作用在于把各种数据包准备无误的传递给对方。由于 IP 地址是稀有资源,不可能每个人都拥有一个 IP 地址,所以我们通常的 IP 地址是路由器给我们生成的 IP 地址,路由器里面会记录我们的 MAC 地址。而 MAC 地址是全球唯一的。举例,IP 地址就如同是我们居住小区的地址,而 MAC 地址就是我们住的那栋楼那个房间那个人。

2.3 UDP协议

UDP 和 TCP 的区别?

UDP 在传送数据之前不需要先建立连接,远地主机在收到 UDP 报文后,不需要给出任何确认。虽然 UDP 不提供可靠交付,但在某些情况下 UDP 确是⼀种最有效的工作方式(⼀般用于即时通信),比如: QQ 语⾳、 QQ 视频 、直播等等。

TCP 提供面向连接的服务。在传送数据之前必须先建立连接,数据传送结束后要释放连接。TCP 不提供广播或多播服务。由于 TCP 要提供可靠的、面向连接的传输服务(TCP 的可靠体现在 TCP 在传递数据之前,会有三次握手来建立连接,⽽且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源),这⼀难以避免增加了许多开销,如确认,流量控制,计时器以及连接管理等。这不仅使协议数据单元的首部增大很多,还要占用许多处理机资源。TCP ⼀般用于文件传输、发送和接收邮件、远程登录等场景。

2.4 TCP协议

2.4.1 认识TCP协议

TCP 把连接作为最基本的对象,每一条 TCP 连接都有两个端点,这种断点我们叫作套接字(socket),它的定义为端口号拼接到 IP 地址即构成了套接字,例如,若 IP 地址为 192.168.4.16,而端口号为 80,那么得到的套接字为 192.168.4.16 :80。

2.4.2 TCP报文首部

  1. 源端口和目的端口,各占2个字节,分别写入源端口和目的端口;
  2. 序号,占4个字节,TCP连接中传送的字节流中的每个字节都按顺序编号。例如,一段报文的序号字段值是 301 ,而携带的数据共有100字段,显然下一个报文段(如果还有的话)的数据序号应该从401开始;
  3. 确认号,占4个字节,是期望收到对方下一个报文的第一个数据字节的序号。例如,B收到了A发送过来的报文,其序列号字段是501,而数据长度是200字节,这表明B正确的收到了A发送的到序号700为止的数据。因此,B期望收到A的下一个数据序号是701,于是B在发送给A的确认报文段中把确认号置为701;
  4. 数据偏移,占4位,它指出TCP报文的数据距离TCP报文段的起始处有多远;
  5. 保留,占6位,保留今后使用,但目前应都位0;
  6. 紧急URG,当URG=1,表明紧急指针字段有效。告诉系统此报文段中有紧急数据;
  7. 确认ACK,仅当ACK=1时,确认号字段才有效。TCP规定,在连接建立后所有报文的传输都必须把ACK置1;
  8. 推送PSH,当两个应用进程进行交互式通信时,有时在一端的应用进程希望在键入一个命令后立即就能收到对方的响应,这时候就将PSH=1;
  9. 复位RST,当RST=1,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立连接;
  10. 同步SYN,在连接建立时用来同步序号。当SYN=1,ACK=0,表明是连接请求报文,若同意连接,则响应报文中应该使SYN=1,ACK=1;
  11. 终止FIN,用来释放连接。当FIN=1,表明此报文的发送方的数据已经发送完毕,并且要求释放;
  12. 窗口,占2字节,指的是通知接收方,发送本报文你需要有多大的空间来接受;
  13. 检验和,占2字节,校验首部和数据这两部分;
  14. 紧急指针,占2字节,指出本报文段中的紧急数据的字节数;
  15. 选项,长度可变,定义一些其他的可选的参数。

    2.4.3 三次握手

    网络协议 - 图4

  16. 第一次握手:主机 A 发送位码为 syn= 1,随机产生 seq number=1234567 的数据包到服务器,主机 B 由 SYN=1 知道, A 要求建立联机;

  17. 第二次握 手:主机 B 收到请求后要确认联机信息 , 向 A 发 送 ack number=( 主 机 A 的seq+1),syn=1,ack=1, 随机产生 seq=7654321 的数据包。
  18. 第三次握手:主机 A 收到后检查 ack number 是否正确,即第一次发送的 seq number+1,以及位码 ack 是否为 1,若正确, 主机 A 会再发送 ack number=(主机 B 的 seq+1),ack=1,主机 B 收到后确认 seq 值与 ack=1 则连接建立成功。

    2.4.4 四次挥手

    网络协议 - 图5

  19. 关闭客户端到服务器的连接:首先客户端 A 发送一个 FIN,用来关闭客户端到服务器的数据传送,然后等待服务器的确认。其中终止标志位 FIN=1,序列号 seq=u。

  20. 服务器收到这个 FIN,它返回一个 ACK,确认号 ack 为收到的序号加 1。
  21. 关闭服务器到客户端的连接:也是发送一个 FIN 给客户端。
  22. 客户端收到 FIN 后,并发回一个 ACK 报文确认,并将确认序号 seq 设置为收到序号加 1。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

    2.4.5 为什么连接的是三次握手,断开要四次

    因为当 Server 端收到 Client 端的 SYN 连接请求报文后,可以直接发送 SYN+ACK 报文。其中 ACK 报文是用来应答的,SYN 报文是用来同步的。但是关闭连接时,当Server 端收到 FIN 报文时,很可能并不会立即关闭 SOCKET,所以只能先回复一个 ACK 报文,告诉 Client 端,”你发的 FIN 报文我收到了”。只有等到我 Server 端所有的报文都发送完了,我才能发送 FIN 报文,因此不能一起发送。故需要四步握手。

    2.4.6 为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

    按道理来说,四个报文都发送完毕,我们可以直接进入 CLOSE 状态了,但是我们必须假设网络是不可靠的,有可能最后一个 ACK 丢失。所以 TIME_WAIT 状态就是用来重发可能丢失的 ACK 报文。在 Client 发送出最后的 ACK 回复,但该 ACK 可能丢失。Server 如果没有收到 ACK,将不断重复发送 FIN 片段。所以 Client 不能立即关闭,它必须确认 Server 接收到了该 ACK。Client 会在发送出 ACK 之后进入到 TIME_WAIT 状态。Client 会设置一个计时器,等待 2MSL 的时间。如果在该时间内再次收到FIN,那么 Client 会重发 ACK 并再次等待 2MSL。所谓的 2MSL 是两倍的 MSL(Maximum Segment Lifetime)。MSL 指一个片段在网络中最大的存活时间,2MSL 就是一个发送和一个回复所需的最大时间。如果直到 2MSL,Client 都没有再次收到FIN,那么 Client 推断 ACK 已经被成功接收,则结束 TCP 连接。

    2.4.7 为什么不能用两次握手进行连接?

    3 次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。

现在把三次握手改成仅需要两次握手,死锁是可能发生的。作为例子,考虑计算机 S 和 C 之间的通信,假定 C 给 S 发送一个连接请求分组,S 收到了这个分组,并发送了确认应答分组。按照两次握手的协定,S 认为连接已经成功地建立了,可以开始发送数据分组。可是,C 在 S 的应答分组在传输中被丢失的情况下,将不知道 S 是否已准备好,不知道 S 建立什么样的序列号,C 甚至怀疑 S 是否收到自己的连接请求分组。在这种情况下,C 认为连接还未建立成功,将忽略 S 发来的任何数据分 组,只等待连接确认应答分组。而 S 在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。

2.4.8 为什么TCP建立连接不是四次握手?

  1. A 发送 SYN 报文给 B,这是第一次报文交互。
  2. B 发送 ACK 确认 A 的SYN报文,这是第二次报文交互。
  3. B 发送自己的 SYN 报文给 A,这是第三次报文交互。
  4. A 需要 ACK 确认 B 的 SYN 报文,这是第四次报文交互。

以上的演绎没有问题,但是报文 2、3 为何要分开发送呢?

  • 增加了延迟不说,同时还白白浪费了网络的带宽,完全可以将报文2、3合并起来,不就是在报文2的ACK状态位的位置置“1”就结了吗?

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

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

    2.5 HTTP协议

    2.5.1 认识HTTP协议

    HTTP,超文本传输协议,它是互联网上应用最为广泛的一种网络协议。HTTP 是一种应用层协议,它是基于 TCP 协议之上的请求/响应式的协议。
    对于从客户端到服务器的每一个请求,都有4个步骤:
  1. 默认情况下,客户端在端口 80 打开与服务器的一个 TCP 连接,URL 中还可以指定其他端口。
  2. 客户端向服务器发送消息,请求指定路径上的资源。这个资源包括一个首部,可选地(取决于请求的性质)还可以有一个空行,后面是这个请求的数据。
  3. 服务器向客户端发送响应。响应以响应码开头,后面是包含数据的首部、一个空行以及所请求的文档或错误消息。
  4. 服务器关闭连接。

    2.5.2 HTTP原理

    HTTP 是一个无状态的协议。无状态是指客户机(Web 浏览器)和服务器之间不需要建立持久的连接,这意味着当一个客户端向服务器端发出请求,然后服务器返回响应(response),连接就被关闭了,在服务器端不保留连接的有关信息.HTTP 遵循请求(Request)/应答(Response)模型。客户机(浏览器)向服务器发送请求,服务器处理请求并返回适当的应答。所有 HTTP 连接都被构造成一套请求和应答。

    2.5.3 传输原理

  5. 地址解析:如用客户端浏览器请求这个页面: http://localhost.com:8080/index.html 从中分解出协议名、主机名、端口、对象路径等部分,对于我们的这个地址,解析得到的结果如下:

    • 协议名: http
    • 主机名: localhost.com
    • 端口: 8080
    • 对象路径: /index.htm
    • 在这一步,需要域名系统 DNS 解析域名 localhost.com,得主机的 IP 地址。
  6. 封装 HTTP 请求数据包 :把以上部分结合本机自己的信息,封装成一个 HTTP 请求数据包 。
  7. 封装成 TCP 包并建立连接 :封装成 TCP 包,建立 TCP 连接(TCP 的三次握手) 。
  8. 客户机发送请求命令 :建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是 MIME 信息包括请求修饰符、客户机信息和可内容。
  9. 服务器响应 :服务器接到请求后,给予相应的响应信息, 其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是 MIME 信息包括服务器信息、实体信息和可能的内容。
  10. 服务器关闭 TCP 连接 :服务器关闭 TCP 连接: 一般情况下,一旦 Web 服务器向浏览器发送了请求数据,它就要关闭 TCP 连接,然后如果浏览器或者服务器在其头信息加入了这行代码 Connection:keep-alive, TCP 连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。

    2.5.4 请求与响应

    网络协议 - 图6
    1、HTTP 请求
  • 请求主要包括三部分内容:请求行,请求头,请求体 。
  • 请求行:
    • 请求方式:POST、GET
    • 请求的资源:/DemoEE/form.html
    • 协议版本:HTTP/1.1(一般都是)
    • HTTP/1.0,发送请求,创建一次连接,获得一个web资源,连接断开。
    • HTTP/1.1,发送请求,创建一次连接,获得多个web资源,保持连接。
  • 请求头:请求头是客户端发送给服务器端的一些信息,使用键值对表示 key:value。 | Referer | 浏览器通知服务器,当前请求来自何处。如果是直接访问,则不会有这个头。常用于:防盗链 | | —- | —- | | If-Modified-Since | 浏览器通知服务器,本地缓存的最后变更时间。与另一个响应头组合控制浏览器页面的缓存。 | | Cookie | 与会话有关技术,用于存放浏览器缓存的cookie信息。 | | User-Agent | 浏览器通知服务器,客户端浏览器与操作系统相关信息 | | Connection | 保持连接状态。Keep-Alive 连接中,close 已关闭 | | Host | 请求的服务器主机名 | | Content-Length | 请求体的长度 | | Content-Type | 如果是POST请求,会有这个头,默认值为application/x-www-form-urlencoded,表示请求体内容使用url编码 | | Accept: | 浏览器可支持的MIME类型。文件类型的一种描述方式。MIME格式:大类型/小类型[;参数]
    例如:
    text/html ,html文件
    text/css,css文件
    text/javascript,js文件
    image/*,所有图片文件 | | Accept-Encoding | 浏览器通知服务器,浏览器支持的数据压缩格式。如:GZIP压缩 | | Accept-Language | 浏览器通知服务器,浏览器支持的语言。各国语言(国际化i18n) |

网络协议 - 图7
2、HTTP 响应

  • 响应主要包括三部分内容:响应行,响应头,响应体
  • 常见的状态码:
    • 200 :请求成功。
    • 302 :请求重定向。
    • 304 :请求资源没有改变,访问本地缓存。
    • 404 :请求资源不存在。通常是用户路径编写错误,也可能是服务器资源已删除。
    • 500 :服务器内部错误。通常程序抛异常。

      2.5.5 HTTP和HTTPS

      HTTP 协议被用于在 Web 浏览器和网站服务器之间传递信息。HTTP 协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了 Web 浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此HTTP协议不适合传输一些敏感信息,比如信用开号、密码等。

为了解决 HTTP 协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议 HTTPS。为了数据传输的安全,HTTPS 在 HTTP 的基础上加入了 SSL 协议,SSL 依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。

HTTPS 和 HTTP 的区别主要为以下四点:

  1. https 协议需要到 ca 申请证书,一般免费证书很少,需要缴费。
  2. http 是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
  3. http 和 https 使用的是完全不同的连接方式,用的端口也不一样,前者是 80,后者是 443。
  4. http 的连接很简单,是无状态的;https 协议是有 ssl+http 协议构建的可进行加密传输、身份认证的网络协议,比 http 协议安全。