点击上方"数据与人", 右上角选择“设为星标”
分享干货,共同成长!


TCP报文
源端口号(16位)和目的端口号(16位):再加上 ip 首部的源 ip 地址和目的IP地址可以唯一确定一个 TCP 连接。 数据序号(16位):表示在这个报文段中的第一个数据字节序号。 确认序号:仅当ACK标志为 1 时有效,确认号表示期望收到的下一个字节的序号。 偏移:就是头部长度,有 4 位,跟 ip 头部一样,以 4 字节为单位。最大是 60 个字节。 保留位:6 位,必须为 0。 6 个标志位:URG-紧急指针有效;ACK-确认序号有效;PSH-接收方应尽快将这个报文交给应用层;RST-连接重置;SYN-同步序号用来发起一个连接;FIN-终止一个连接。 窗口字段:16 位,代表的是窗口的字节容量,也就是TCP的标准窗口最大为2^16 - 1 = 65535个字节。 校验和:源机器基于数据内容计算一个数值,收信息机要与源机器数值结果完全一样,从而证明数据的有效性。检验和覆盖了整个的 TCP 报文段:这是一个强制性的字段,一定是由发送端计算和存储,并由接收端进行验证的。

TCP三次握手
Q:为什么要三次握手?
Q:两次握手不行吗?为什么 TCP 客户端最后还要发送一次确认呢?
Q:为什么三次握手,返回时 ack = seq + 1?
Q:SYN 洪泛攻击(SYN Flood,半开放攻击),怎么解决?
缩短超时(SYN Timeout)时间
增加最大半连接数
过滤网关防护
SYN cookies 技术
Q:TCP三次握手中,最后一次回复丢失,会发生什么?
TCP四次挥手
Q:为什么连接的时候是三次握手,关闭的时候却是四次握手?
Q:为什么TCP挥手每两次中间有一个 FIN-WAIT2等待时间?
Q:为什么客户端最后还要等待 2MSL?为什么还有个 TIME-WAIT 的时间等待?
Q:客户端 TIME-WAIT 状态过多会产生什么后果?怎样处理?
高并发可以让服务器在短时间范围内同时占用大量端口,而端口有个 0~65535 的范围,并不是很多,刨除系统和其他服务要用的,剩下的就更少了。
短连接表示“业务处理+传输数据的时间 远远小于 TIMEWAIT 超时的时间”的连接。
用负载均衡来抗这些高并发的短请求。
服务器可以设置 SO_REUSEADDR 套接字选项来避免 TIME_WAIT状态,TIME_WAIT 状态可以通过优化服务器参数得到解决,因为发生TIME_WAIT的情况是服务器自己可控的,要么就是对方连接的异常,要么就是自己没有迅速回收资源,总之不是由于自己程序错误导致的。
强制关闭,发送 RST 包越过 TIMEWAIT 状态,直接进入 CLOSED 状态。
Q:服务器出现了大量 CLOSE_WAIT 状态如何解决?
Q:服务端会有一个 TIME_WAIT 状态吗?如果是服务端主动断开连接呢?

文章转载自数据与人,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




