写点什么

TCP 面试相关总结

作者:Java高工P7
  • 2021 年 11 月 11 日
  • 本文字数:1995 字

    阅读完需:约 7 分钟

1)主机 A 发送标志 syn=1,随机产生 seq =1234567 的数据包到服务器,主机 B 由 syn=1 知道,A 要求建立连接; 此时状态 A 为 SYN_SENT,B 为 LISTEN


2)主机 B 收到请求后要确认连接信息,向 A 发送 ack =(主机 A 的 seq+1),标志 syn=1,ack=1,随机产生 seq=7654321 的包, 此时状态 A 为 ESTABLISHED,B 为 SYN_RCVD


3)主机 A 收到后检查 ack 是否正确,即第一次发送的 seq number+1,以及位码 ack 是否为 1,若正确,主机 A 会再发送 ack =(主机 B 的 seq+1),标志 ack=1,主机 B 收到后确认 seq 值与 ack=1 则连接建立成功。 此时 A、B 状态都变为 ESTABLISHED


2、TCP 四次挥手过程


断开连接过程与建立连接类似


1)主机 A 发送位码为 FIN=1,用来关闭客户 A 到服务器 B 的数据传送。此时 A 的状态为 FIN_WAIT_1


2)服务器 B 收到这个 FIN,它发回一个 ACK,确认序号为收到的序号加 1。此时 A 为 FIN_WAIT_2,B 为 CLOSE_WAIT


3)服务器 B 关闭与客户端 A 的连接,发送一个 FIN 给客户端 A。此时 A 为 TIME_WAIT,B 为 LAST_ACK


4)客户端 A 发回 ACK 报文确认,并将确认序号设置为收到序号加 1。此时 A、B 都关闭了,状态变为 CLOSED。


当(2)、(3)步中的 ACK 和 FIN 在一个包中发送时,A 的状态会直接从 FIN_WAIT_1 变为 TIME_WAIT


3、为什么建立连接需要三次握手,而断开连接需要四次握手


因为每个方向都需要一个 FIN 和 ACK,当一端发送了 FIN 包之后,处于半关闭状态,此时仍然可以接收数据包。


但是在断开连接时,如果一端收到 FIN 包,但此时仍有数据未发送完,此时就需要先向对端回复 FIN 包的 ACK。等到将剩下的数据都发送完之后,再向对端发送 FIN,断开这个方向的连接。


因此很多时候 FIN 和 ACK 需要在两个数据包中发送,因此需要四次握手


4、TIME_WAIT 状态持续时间及原因


持续时间未 2MSL,一个数据包在网络中的最长生存时间为 MSL。


假设最后客户端回复的 ACK 丢失,服务器端会在超时时间到来时,重传最后一个 FIN 包


5、超时重传和快速重传


超时重传:当超时时间到达时,发送方还未收到对端的 ACK 确认,就重传该数据包


快速重传:当后面的序号先到达,如接收方接收到了 1、 3、 4,而 2 没有收到,就会立即向发送方重复发送三次 ACK=2 的确认请求重传。如果发送方连续收到 3 个相同序号的 ACK,就重传该数据包。而不用等待超时


7、TCP 选项有哪些


TCP 首部选项字段多达 40B,一些常用的字段有:


1)选项结束字段(EOP,0x00),占 1B,一个报文段仅用一次。放在末尾用于填充,用途是说明:首部已经没有更多的消息,应用数据在下一个 32 位字开始处


2)无操作字段(NOP, 0x01),占 1B,也用于填充,放在选项的开头


3)MSS(最大报文段长度),格式如下:种类(1B,值为 2),长度(1B,值为 4),数值(2B)


用于在连接开始时确定 MSS 的大小,如果没有确定,就用默认的(一般实现是 536B)


4)窗口扩大因子,格式如下:种类(1B,值为 3),长度(1B,值为 3),数值(1B)


新窗口值 = 首部窗口值 * 2 的(扩大因子)次方


当通信双方认为首部的窗口值还不够大的时候,在连接开始时用这个来定义更大的窗口。仅在连接开始时有效。一经定义,通信过程中无法更改。


5)时间戳(应用测试 RTT 和防止序号绕回)


6)允许 SACK 和 SACK 选项


10、三次握手过程中有哪些不安全性


1)伪装的 IP 向服务器发送一个 SYN 请求建立连接,然后服务器向该 IP 回复 SYN 和 ACK,但是找不到该 IP 对应的主机,当超时时服务器收不到 ACK 会重复发送。当大量的攻击者请求建立连接时,服务器就会存在大量未完成三次握手的连接,服务器主机 backlog 被耗尽而不能响应其它连接。即 SYN 泛洪攻击


防范措施:


1、降低 SYN timeout 时间,使得主机尽快释放半连接的占用


2、采用 SYN cookie 设置,如果短时间内连续收到某个 IP 的重复 SYN 请求,则认为受到了该 IP 的攻击,丢弃来自该 IP 的后续请求报文


3、在网关处设置过滤,拒绝将一个源 IP 地址不属于其来源子网的包进行更


【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


远的路由


11、TCP 和 UDP 的区别


TCP 是有连接的,两台主机在进行数据交互之前必须先通过三次握手建立连接;而 UDP 是无连接的,没有建立连接这个过程


TCP 是可靠的传输,TCP 协议通过确认和重传机制来保证数据传输的可靠性;而 UDP 是不可靠的传输


TCP 还提供了拥塞控制、滑动窗口等机制来保证传输的质量,而 UDP 都没有


TCP 是基于字节流的,将数据看做无结构的字节流进行传输,当应用程序交给 TCP 的数据长度太长,超过 MSS 时,TCP 就会对数据进行分段,因此 TCP 的数据是无边界的;而 UDP 是面向报文的,无论应用程序交给 UDP 层多长的报文,UDP 都不会对数据报进行任何拆分等处理,因此 UDP 保留了应用层数据的边界


12、有哪些应用层协议是基于 TCP 的,哪些是基于 UDP 的


TCP: FTP、HTTP、Telnet、SMTP、POP3、HTTPS


UDP:DNS、SNMP、NFS


TCP 可靠传输的实现:


1.以字节为单位的滑动窗口


发送窗口的位置有窗口前沿和后沿的位置共同决定。发送窗口后沿的变化情况有两种,即不动(没有收到新的确认)和前移(收到了新的确认)。


描述一个发送窗口的状态需要三个指针:P1,P2,P3。

用户头像

Java高工P7

关注

还未添加个人签名 2021.11.08 加入

还未添加个人简介

评论

发布
暂无评论
TCP面试相关总结