知识点

  1. TCP/IP的网络协议
  2. 三次握手,四次挥手
  3. http详解
  4. https详解
  5. http请求优化

一、TCP/IP的四层网络协议

  1. 应用层
    决定了向用户提供应用服务的通信活动
    • FTP(文件传输协议)
    • DNS(域名解析) 提供域名到ip地址的解析服务
  2. 传输层
    传输层对应上层应用层,提供处于网络连接中的两台计算机之间的数据传输
    • TCP(传输控制协议)
    • UDP(用户数据报协议) UDP不能保证数据的无误传输,协议不可靠
  3. 网络层(IP)
    用来处理网络上的数据包,数据包是网络传输的最小数据单位。该层规定了通过什么路径到达对方计算机,并把数据包传送给对方。
  4. 链路层
    用来处理连接网络的硬件部分,包括控制操作系统,硬件的设备驱动,网卡,及光纤等物理课件部分。硬件上的范畴均在链路层的作用范围值内。

二、TCP的三次握手 / TCP四次挥手

  • 确认ACK
  • 同步SYN
  • 终止FIN

面试题参考

TCP的三次握手

为了保证数据最大程度的准确,TCP采取了三次握手。握手标志为 SYN和ACK

  1. 客户端首先发送一个带SYN标志的数据包给接收端
  2. 接收端收到后回传一个带SYN/ACK标志的数据包,表示传达确认信息
  3. 最后客户端回传一个ACK标志的数据包给接收端

TCP四次挥手

参考

当客户端和服务器通过三次握手建立了TCP连接以后,当数据传送完毕,肯定是要断开TCP连接的啊。那对于TCP的断开连接,这里就有了神秘的“四次挥手”。
中断连接的一端可以是客户端,也可以是服务器端
(1) TCP客户端发送一个FIN=M,请求与服务端断开数据连接
(2) 服务器接收到这个FIN,发回一个ACK=M+1,确认应答
(3) 服务端将最后的数据发送完后,发送一个FIN=N给客户端,表示我这边准备断开连接
(4) 客户端发送给服务器ACK=N+1,服务器收到后就关闭连接。客户端在等待2MSL后依旧没有收到任何东西后关闭连接

三、URI和URL,URN的区别

  1. uri:统一资源标识符
  2. URL:统一资源定位符
  3. URN:统一资源名称

URI包括URL和URN

URL

四、HTTP协议

版本 产生时间 内容
HTTP/0.9 1991年 不涉及数据包传输,规定客户端和服务器之间通信格式,只能GET请求
HTTP/1.0 1996年 传输内容格式不限制,增加PUT、PATCH、HEAD、 OPTIONS、DELETE命令
HTTP/1.1 1997年 持久连接(长连接)、节约带宽、HOST域、管道机制、分块传输编码
HTTP/2 2015年 多路复用、服务器推送、头信息压缩、二进制协议等

HTTP协议请求报文

请求报文由以下部分组成

  • 请求行
    • 请求方法
    • URI(请求地址)
    • 协议版本
  • 请求头部字段
  • 请求数据

请求方法

HTTP/1.1 定义请求方法

请求地址

URL:统一资源定位符
组成:<协议>://<主机>:<端口>/路径 http://localhost:8080/myweb/hello.html
例子:

协议版本

常用的为 HTTP/1.0 , HTTP/1.1和HTTP2.0

请求头部字段

参考
请求头部为请求报文添加了一些附加信息
请求头部的最后一行会有一个空行,表示请求头部结束,接下来为请求数据

请求数据

可选部分,比如GET请求就没有请求数据

POST报文例子

POST  /index.php HTTP/1.1    请求行
Host: localhost   请求头
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer: http://localhost/
Content-Length:25
Content-Type:application/x-www-form-urlencoded
  空行
username=aa&password=1234  请求数据  

HTTP响应报文


HTTP响应报文主要由状态行、响应头部、空行以及响应数据组成。

  • 状态行
    • 协议版本
    • 状态码
    • 状态码描述
  • 响应头部字段
  • 响应数据

协议版本

和请求报文一致

状态码

参考1 参考2

200:请求被正常处理
204:请求被受理但没有资源可以返回
206:客户端只是请求资源的一部分,服务器只对请求的部分资源执行GET方法,相应报文中通过Content-Range指定范围的资源。
301:永久性重定向
302:临时重定向
303:与302状态码有相似功能,只是它希望客户端在请求一个URI的时候,能通过GET方法重定向到另一个URI上
304:发送附带条件的请求时,条件不满足时返回,与重定向无关
307:临时重定向,与302类似,只是强制要求使用POST方法
400:请求报文语法有误,服务器无法识别
401:请求需要认证
403:请求的对应资源禁止被访问
404:服务器无法找到对应资源
500:服务器内部错误
503:服务器正忙

响应头部字段

参考

HTTP content-type 对照表

响应数据

用于存放需要返回给客户端的数据信息。

响应报文实例

HTTP/1.1 200 OK  状态行
Date: Sun, 17 Mar 2013 08:12:54 GMT  响应头部
Server: Apache/2.2.8 (Win32) PHP/5.2.5
X-Powered-By: PHP/5.2.5
Set-Cookie: PHPSESSID=c0huq7pdkmm5gg6osoe3mgjmm3; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 4393
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8
  空行
 
<html>  响应数据
<head>
<title>HTTP响应示例<title>
</head>
<body>
Hello HTTP!
</body>
</html>

数据已经传递完毕,HTTP/1.1会维持持久连接,但持续一段时间总会有关闭连接的时候,这时候据需要断开TCP连接

五、HTTP的特点和缺点

特点:

  • 无状态:协议对客户端没有储存状态,对事物没有“记忆力”,比如访问一个网站需要反复进行登录操作
  • 无连接:每次请求都需要三次握手四次挥手,服务器并不能区别是否响应过用户的请求,所以每次需要重新响应请求,需要耗费不必要的时间和流量
  • 基于请求和响应:基本特性,由客户端发起请求,服务端响应
  • 简单快速、灵活
  • 通信使用明文、请求和响应不会对通信方进行确认、无法保护数据的完整

缺点:

  • 通信使用明文,没有加密,可能被窃听(通过加密解决)
  • 不验证通信方的身份,可能遭遇伪装 (通过证书解决)
  • 无法证明报文完整性,可能已经遭篡改 (通信时会发送内容和内容的hash值用来验证完整性)

http无状态的解决办法

  1. 通过Cookies/Session技术
  2. HTTP/1.1 持久连接(connect:Keep-alive)

六、HTTPS

参考

因为HTTP协议存在上面的三个问题,存在安全隐患,通过 SSL(安全嵌套字) 和HTTP协议组合使用,加密HTTP的通信内容,这被称为HTTPS(HTTP sercure 超文本传输安全协议)

HTTP+加密+认证+完整性保护 = HTTPS

HTTP和TCP通信,变成HTTP和SSL通信,SSL和TCP通信

            HTTP和TCP通信
                  ↓
HTTP和SSL/TLS通信 + SSL/TLS和TCP通信

(1)HTTPS混合机密机制
非对称加密: 一个公钥和一个私钥,不需要传输私钥,安全性较高看,但是处理速度慢。(RSA、Elgamal)

对称加密: 一个私钥,双方持有,需要传输私钥,容易被窃取,安全性低,处理速度快。(DES算法,3DES算法)

混合加密: 采用非对称加密算法的公钥,加密对称加密的私钥,传输数据使用对称加密的私钥加密数据,既保证数据传输安全,也能保证秘钥安全。

HTTPS特点:

  1. 内容加密:使用混合加密技术,中间者无法查看明文内容
  2. 验证身份:通过证书认证客户端访问的是自己的服务器
  3. 保护数据完整性:通信时发送内容和内容hash值用来验证完整性,防止传输内容被中间人冒充或篡改

混合加密: 结合非对称加密和对称加密技术。客户端使用对称加密生成密钥对传输数据进行加密,然后使用非对称加密的公钥再对秘钥进行加密,所以网络上传输的数据是被秘钥加密的密文和用公钥加密后的秘密秘钥,因此即使被黑客截取,由于没有私钥,无法获取到加密明文的秘钥,便无法获取到明文数据。

数字摘要: 通过单向hash函数对原文进行哈希,将需加密的明文“摘要”成一串固定长度(如128bit)的密文,不同的明文摘要成的密文其结果总是不相同,同样的明文其摘要必定一致,并且即使知道了摘要也不能反推出明文。

数字签名技术: 数字签名建立在公钥加密体制基础上,是公钥加密技术的另一类应用。它把公钥加密技术和数字摘要结合起来,形成了实用的数字签名技术。

https 通信流程

  1. 客户端向服务端发送https请求,要与服务端建立SSL连接
  2. 服务端接收到请求后会生成一对公钥和私钥,并将公钥放在证书中发送给客户端
  3. 客户端根据双方同意的SSL连接的安全等级,建立会话密钥,然后以公钥将密钥加密,并传送给服务器。
  4. 服务器用自己的私钥解出会话密钥
  5. 服务器利用会话密钥加密和客户端之间的通信

六、HTTP优化

经典举措

  • 并行连接:建立多个TCP连接通道
  • 长连接:HTTP/1.1 默认开启长连接 Keep-alive
  • 缓存
    • Cache-control来控制缓存
    • If-Modified-Since

HTTP/2.0优化举措

  • 头部压缩
    将原来每次都要携带的大量key value在两端建立一个索引表,对相同表头只发送索引表中的索引
  • 多路复用和分帧
    • 将一个TCP连接切分成多个流,每个流都有自己的ID,并且流是可以从服务端发往客户端的。流各有优先级
    • 将所有的传输消息分割成更小的帧(常见帧有Header帧,Data帧等。不同的帧属于不同的流)
    • 通过以上两种机制,客户端可以将多个请求分散到不同的流中,然后将请求的内容拆分为帧。进行二进制传输
  • 二进制编码
    对帧进行二进制编码,压缩体积,提高传输效率