这是由 TCP 的自身特点可靠传输决定的。客户端和服务端要进行可靠传输,那么就需要确认双方的接收和发送能力。
第一次握手可以确认客服端的发送能力,
第二次握手,确认了服务端的发送能力和接收能力,
第三次握手才可以确认客户端的接收能力。不然容易出现丢包的现象。
断开连接时,需要发送四次报文
四次挥手是保证客户端没有数据传输了
第一次是客户端->服务端
第二次是服务端->客户端
第三次是服务端->客户端
第四次是客户端->服务端
如果将第二次和第三次合并,会导致客户端重发请求
HTTP 在应用层,TCP/UDP 在传输层
TCP有连接有断开,稳定传输,适合数据通信
UDP无连接五断开无状态,不稳定传输但效率高,适合视频会议、语音通话
HTTP 1.0:最基础的 HTTP 协议,只实现了 GET 和 POST, 每一次 TCP都要连接和断开
HTTP 1.1:
-
增加了缓存策略cache-control E-tag
-
支持长连接Connection:keep-alive,一次 TCP连接多次请求,提高效率;
-
支持断点续传,状态码 206,传输完毕状态码 200;
-
支持新的方法,PUT,DELETE等,可用于 Restful API
HTTP 2.0:
-
压缩 Header较少体积
-
多路复用,一个 TCP 连接中可以多个HTTP并发请求。这样的话之前将文件合并减少请求就不再必要,因为多个文件可以并发请求
-
支持服务端推送
HTTPS 加密传输,生产环境应该使用 HTTPS 协议
HTTPS加密传输 HTTP+TLS/SSL
同时使用对称加密和非对称加密
- 一开始使用非对称加密,服务端将私钥 B和公钥A都存在服务器。
- 服务器响应客户端请求时,将公钥 A 传递给客户端
- 客户端取出公钥 A,然后用公钥 A 加密一个随机 key
- 然后将加密后的 key传递给服务端
- 服务端用私钥 A 进行解密,取出随机 key
- 然后服务端使用加密随机码key对数据进行加密传输给客户端
- 客户端使用随机 key解密数据。这样就是对称加密。这样中间就算随机码 key被劫持,因为密钥只存在服务器,黑客也不能解密。
中间人攻击:使用公钥加密的过程中,公钥是在服务器和客户端之间传输的,是可以被劫持的。尽管黑客没有私钥不能够进行解密,但是它可以更换公钥。黑客可以将假的公钥传送给客户端,客户端用假的公钥生成随机码像服务端发送时,黑客可以再次劫持数据,并用自己的私钥对随机码进行解密。
预防中间人攻击:服务端申请 CA 证书,由第三方认证机构签发,浏览器会验证证书的合法性。
对称加密:用同一个密钥进行加密和解密。如果使用对称加密,密钥也需要进行网络传输,这样中间密钥就容易被劫持。
非对称加密:两个密钥,公钥和私钥,公钥加密,私钥解密。如果使用非对称加密,客户端和服务端就要互相交互公钥,但是私有只在服务端,被劫持也不能解密。
websocket
- 支持端对端通信
- 可以由客户端发起,也可以由服务端发起
- 用于消息通知,直播间讨论,聊天室,协同编辑
websocket连接过程:
websocket自身没有请求连接,需要借助 HTTP 请求
- 先发起一个 HTTP 请求
- 成功之后升级到websocket协议,再通讯
区别:
- 协议名不同,websocket协议名是
ws://
- websocket可双端发起请求,HTTP 是单端请求
- websocket无跨域限制
- 通过
send
和onmessage
通讯,HTTP 是通过request
和reponse
通讯
ws协议也可以升级为wss
进行加密传输
实际项目中可以使用socket.io
HTTP 长轮询:
- 客户端发起请求,服务端阻塞等待,不会立即返回
- 需要处理timeout超时机制,即timeout超时后连接断开,客户端需要重新发起请求
websocket:客户端可以发起请求,服务端也可以发起请求,客户端不用等待
- 200 请求成功
- 301 永久重定向
- 302 临时重定向
- 403 无权限
- 404 服务器上没找到该资源
- 500 服务器错误