计算机网络知识
1. 三次握手与四次挥手
1.1 三次握手
- 为什么建立连接的时候是三次握手,而不是两次握手?
是为了防止已经失效的报文突然又传到服务器引起错误。假设是利用两次握手建立连接,在某个时间节点,客服端向服务器发送了一个 SYN1 包请求建立连接,但是由于某些未知原因,该包未正常到达服务端。为了建立连接,客服端回重新发送 SYN2 包,这次的请求包正常到达服务端,然后服务端返回 SYN + ACK 包建立起了连接。但是这时 SYN1 包又重新到达服务端,服务端会认为这是客户端又发起的新的连接,于是又回复了一个 SYN + ACK 包,进入等待数据状态。上面的这个过程会导致服务端认为建立了两个连接,而客户端认为只有一个连接,造成了状态不一致的情况。但如果是三次握手的话,即使服务端收到了错误的 SYN1 包,但是由于没有收到客户端发送的 ACK 包,所以不会建立第二条连接。所以 TCP 的三次握手本质上是为了解决网络信道不可靠的问题,为了在不可靠的信道上建立起可靠的连接。
2. 为什么说 TCP 协议是可靠的协议(怎么解决丢包问题、乱序问题)?
TCP 协议为每一个连接建立一个发送缓冲区(index 从 0 开始),发送数据时从发送缓冲区取一部分数据组成报文,在其 TCP 协议头中会携带序列号和长度。接收端在收到数据后会回复确认报文,确认报文中的 ACK 等于序列号加长度(下一包数据的起始序列号)。通过序列号和长度将乱序数据包重组;通过接收端返回的 ACK 信息确认是否需要重传。
3. 三次握手有什么作用:
(1)三次使双方做好发送数据的准备,其实也就是在握手完成后会分配相应的资源,专门处理对方的传输的数据;
(2)经过三次握手,双方可以协商序列号。
- TCP的三次握手一定能保证传输可靠吗?
不能。
三次握手比两次握手更可靠,但是也不完全可靠,但是追加更多次握手也不能使连接变得更可靠。因此选择了三次握手。
世界上不存在完全可靠的通信协议。从通信时间、空间成本及可靠度来讲,选择了“三次握手”作为点对点通信的一般规则。
1.2 四次挥手
建立连接非常重要,它是数据正确传输的前提;断开连接同样重要,它让计算机释放不再使用的资源。如果连接不能正常断开,不仅会造成数据传输错误,还会导致套接字不能关闭,持续占用资源,如果并发量高,服务器压力堪忧。
- 为什么连接的时候是三次握手,关闭的时候却是四次握手?
- 因为当 Server 端收到 Client 端的 SYN 连接请求报文后,还未正式开始传输数据,所以可以直接发送 SYN + ACK 报文。其中 ACK 报文使用来应答的,SYN 报文使用来请求同步的。
- 但是关闭连接时,当 Server 端收到 FIN 报文时,很可能还有未发送完的数据,所以不会立刻关闭 SOCKET,而是先回复一个 ACK 报文告诉 Client,“你发的 FIN 报文我收到了”/
- 等 Server 端的所有报文都发送完了,才发送 FIN 报文,因此 Server 端的 SYN 和 ACK 报文不能一起发送。故而需要四次挥手。
2. TCP 和 UDP
TCP 和 UDP 都是传输层协议,传输二进制文件
TCP 是基于连接的,稳定可靠;UDP是基于非连接的,传输速度快
如何选择 TCP 和 UDP:
- UDP
- 一对多通讯
- 效率高
- 简单
- 实时性好,无队头阻塞问题
- TCP
- 传递任意长度信息
- 可靠
- 流量控制
- 拥塞控制
3 使用 HTTP 长连接有哪些优点?
- 减少握手次数:使用 HTTP 长连接可以减少 TCP 建立连接和关闭连接的握手次数(建连三次握手,关闭四次挥手)
- 减少慢启动的影响:每一个连接都是从慢到快的去传输,类似汽车等红绿灯启动的时候,慢慢加速到稳定的 60 码。如果红绿灯较多,就会花费很多时间去启动。
- 缺点:队头阻塞。TCP 协议是字符流协议,如果有一个报文丢包,后面的数据包就无法再传送。
4 介绍下 CLOSE_WAIT 状态产生的原因
5 能介绍下多播是怎样实现的么?
6 服务器的最大并发连接数是多少?
TCP 四元组( SOCKET 套接字)
7 TLS/SSL 协议是怎么保障信息安全的
- PKI 证书体系
- 密钥交换协议
- 对称加密算法
8 HTTP2 协议有哪些优点
- 多路复用·
9 GET 和 POST 的区别
- “标准答案” 如下(本标准答案参考自w3schools)
- GET 在浏览器回退时是无害的,而POST会再次提交请求。
- GET 产生的URL地址可以被Bookmark,而 POST 不可以。
- GET 请求会被浏览器主动 cache,而 POST 不会,除非手动设置。
- GET 请求只能进行url编码,而POST支持多种编码方式。
- GET 请求参数会被完整保留在浏览器历史记录里,而 POST 中的参数不会被保留。
- GET 请求在 URL 中传送的参数是有长度限制的,而 POST 么有。
- 对参数的数据类型,GET 只接受 ASCII 字符,而 POST 没有限制。
- GET 比 POST 更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
- GET 参数通过URL传递,POST 放在 Request body中。
误区:请求参数长度限制:GET请求长度最多1024kb,POST对请求数据没有限制——关于此点,在HTTP协议中没有对URL长度进行限制,这个限制是不同的浏览器及服务器由于有不同的规范而带来的限制。
但其实,GET 和 POST 本质上没有区别!误区及解释如下:
误区1:GET 参数通过URL传递,POST 放在Request body中。
- 这只是约定,而不是规范。实际上我们也可以在 GET 请求中利用 body 携带参数或者在 POST 请求时在 URL 中写入参数。
误区2:GET 请求在 URL 中传送的参数是有长度限制的,而 POST 么有
- 实际上 HTTP 协议并没有对 body 和 URL 的长度作限制,做限制的大多数是浏览器和服务器。
误区3:GET 比 POST 更不安全
- 其实从传输的角度来看,它们都是不安全的,因为 HTTP 在网络上是明文传输的,如果在网络上抓包,就能获取完整的数据报文。只有 HTTPS 是加密安全的
误区4:对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok
- 并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次