1、三次握手:
2、第三次握手是可以携带数据的,前两次不可以
3、为什么是三次握手 三次握手才能保证双方具有接收和发送的能力 三次握手才可以初始化 Socket、序列号和窗口大小并建立 TCP 连接
TCP 建立连接时,通过三次握手能防止历史连接的建立,能减少双方不必要的资源开销,能帮助双方同步初始化序列号。序列号能够保证数据包不重复、不丢弃和按序传输。
不使用「两次握手」和「四次握手」的原因:
「两次握手」:无法防止历史连接的建立,会造成双方资源的浪费,也无法可靠的同步双方序列号;
[四次握手」:三次握手就已经理论上最少可靠连接建立,所以不需要使用更多的通信次数
4、为什么每次建立 TCP 连接时,初始化的序列号都要求不一样呢?
为了防止历史报文被下一个相同四元组的连接接收(主要方面);
为了安全性,防止黑客伪造的相同序列号的 TCP 报文被对方接收;
5、既然 IP 层会分片,为什么 TCP 层还需要 MSS 呢?
ip分片重传没有效率,经过 TCP 层分片后,如果一个 TCP 分片丢失后,进行重发时也是以 MSS 为单位,而不用重传所有的分片,大大增加了重传的效率
6、第一次握手丢失, 重传 次数不超过tcp_syn_retries ,如果还是没有收到服务器的第二次握手,那么客户端就会断开连接
7、第二次握手丢失,客户端就会触发超时重传机制,重传 SYN 报文。服务端这边会触发超时重传机制,重传 SYN-ACK 报文。重传次数都不超过系统的设置,如果再规定时间内和规定次数还是没有收到,客户端、服务端就会断开连接
8、第三次握手丢失,ACK 报文是不会有重传的,当 ACK 丢失了,就由对方重传对应的报文。超过规定的,服务端会断开连接。
9、syn攻击 假设攻击者短时间伪造不同 IP 地址的 SYN
报文,服务端每接收到一个 SYN
报文,就进入SYN_RCVD
状态,但服务端发送出去的 ACK + SYN
报文,无法得到未知 IP 主机的 ACK
应答,久而久之就会占满服务端的半连接队列,使得服务端不能为正常用户服务
全连接队列满了
在服务端并发处理大量请求时,如果 TCP accpet 队列过小,或者应用程序调用 accept() 不及时,就会造成 accpet 队列满了 ,这时后续的连接就会被丢弃,这样就会出现服务端请求数量上不去的现象。
10、TCP 连接,一端断电和进程崩溃有什么区别?