【c++】tcp相关问题
2 被动关闭方(ESTABLISHED→CLOSE_WAIT):回复 ACK 包,ack=u+1,此时进入 “半关闭” 状态(仍可发数据)。4 主动关闭方(FIN_WAIT_2→TIME_WAIT):回复 ACK 包,ack=v+1,被动关闭方接收后进入 CLOSED 状态。快速重传:无需等待超时,收到 3 个相同的重复 ACK(即三次请求同一个报文),立即重传未被确认的报文,效率更高,但会导致更
1 TCP三次握手过程?
客户端和服务端通过三次握手确认,建立可靠连接。
1 客户端(CLOSED→SYN_SENT):发送 SYN 包,携带初始序列号 seq=x。
2 服务端(LISTEN→SYN_RCVD):回复 SYN+ACK 包,seq=y,ack=x+1。
3 客户端(SYN_SENT→ESTABLISHED):发送 ACK 包,ack=y+1,服务端接收后进入 ESTABLISHED 状态。
2 TCP四次挥手过程?
双方分别关闭发送通道,需四次挥手终止连接
1 主动关闭方(ESTABLISHED→FIN_WAIT_1):发送 FIN 包,seq=u,告知 “不再发数据”。
2 被动关闭方(ESTABLISHED→CLOSE_WAIT):回复 ACK 包,ack=u+1,此时进入 “半关闭” 状态(仍可发数据)。
3 被动关闭方(CLOSE_WAIT→LAST_ACK):完成数据发送后,发送 FIN 包,seq=v。
4 主动关闭方(FIN_WAIT_2→TIME_WAIT):回复 ACK 包,ack=v+1,被动关闭方接收后进入 CLOSED 状态。
3 为什么建立连接需要三次握手,而断开连接需要四次握手?
连接时双方可同步确认,断开时存在 “半关闭” 状态。
1 建立连接时:服务端的 SYN 和 ACK 可合并为一个包,一次交互完成 “确认客户端接收能力 + 告知自身收发能力”。
2 断开连接:被动关闭方收到 FIN 后,可能有/没有还需发送的数据,需先回复 ACK 确认关闭,待数据发完再发 FIN,无法合并为一个包。
4 TIME_WAIT状态持续时间及原因
持续 2MSL(最大报文段寿命,默认 1 分钟),为保证连接正常终止。
确保最后一个 ACK 包被对方接收:若被动关闭方未收到 ACK,会重发 FIN,2MSL 足够覆盖重传周期。???? 如果重发FIN会怎么样
避免历史连接的报文干扰新连接:2MSL 内网络中残留的旧报文会自然失效。
5 超时重传和快速重传
TCP重传的两种方式
超时重传:依赖重传计时器,报文发送后若超时未收到 ACK,自动重传该报文,效率较低。
快速重传:无需等待超时,收到 3 个相同的重复 ACK(即三次请求同一个报文),立即重传未被确认的报文,效率更高,但会导致更加拥塞。
6 TCP首部长度,有哪些字段
首部长度 20~60 字节(20 字节固定部分,0~40 字节选项部分)
源端口 目的端口
序列号
确认号
数据偏移 4bit 保留6bit 控制位6bit 窗口16bit
校验和 紧急指针
(可选40B)
7 TCP在listen时的参数backlog的意义
服务端监听事件的 “半连接队列 + 全连接队列” 的最大长度上限。
半连接队列:指已从LISTEN状态接受到客户端CONNECT的队列,进入SYN_RCVD状态
全连接:ESTABLISHED状态的队列,可被accept取走
因此可能被攻击,创建很多半连接队列,使得backlog满而无法接受新的连接
8 Accept发生在三次握手的哪一步?
第三次握手后,服务端accept,进入ESTABLISHED状态
9 三次握手过程中有哪些不安全性
1 SYN 泛洪攻击:发送大量一次握手,使得backlog快速被耗尽
防范措施:降低SYN timeout时间,服务端尽快释放半连接队列;使用cookie记录通ip记录
2 land攻击:截获第二次握手报文,模仿请求连接的客户端继续通信
10 TCP与UDP的区别
tcp:
面向连接
可靠
传输效率低
支持流量控制、拥塞控制
适合文件传输、http、登录
udp:
无连接
不可靠
效率高
不支持流量控制、拥塞控制
适合语音、直播、dns
更多推荐



所有评论(0)