今天是纯网络知识专题✨
TCP粘包和拆包?
TCP正常连接情况下不会由粘包和拆包问题。
粘包:TCP一次请求的数据量如果过小,小于接收方套接字缓冲区大小,就会积攒多个数据包后再发送,造成粘包问题,接收方无法识别每个数据包
拆包:TCP一次请求的数据量过大,就会拆分数据包然后发送,接收方无法
TCP三次握手?
举个栗子: 公安局长王哥 和 陈某打电话
公安局:你好!陈某,听得到吗?(一次会话)
陈某:听到了,王哥,你能听到吗 (二次会话)
公安局:听到了,你过来自首吧 (开始会话)(三次会话)
摘自blog:blog.csdn.net/m0_56649557…
客户端首先发送一个SYN消息给服务器,服务器收到后回复一个SYN-ACK消息,最后客户端再发一个ACK消息。
TCP四次挥手?
举个例子: 张三和李四的对话
张三:好的,那我先走了
李四:好的,那你走吧
李四:那我也走了?
张三:好的,你走吧
摘自blog:blog.csdn.net/m0_56649557…
第一次,客户端主动关闭连接发送FIN包,其进入FIN-WAIT-1状态。
第二次,服务器发送ACK包,服务端进入CLOSE_WAIT,客户端进入FIN_WAIT_2状态。
第三次,服务端发送完所有数据发送FIN包,进入LAST_ACK状态。
第四次,客户端接收到FIN包,发送最后一个ACK包,进入TIME_WAIT状态,服务器收到ACK包后进入CLOSED状态,客户端在TIME_WAIT的2MSL计时结束后进行关闭
MSL -- TCP报文在网络中可以存活的最长时间
四次挥手一定会是四次吗?
不一定
特殊情况下四次可能变成三次:第一次客户端发送FIN时,服务端无数据再发送那么可以直接发送ACK和FIN包,缩减第三步,即总共为三步
为什么需要三次握手和四次挥手?
为了保证数据完整性。
为什么需要TIME_WAIT这个状态?
1.确保最后的ACK成功接收
2.防止旧的重复分段干扰新连接