0328 手打基础丸👺(日更)

41 阅读2分钟

今天是纯网络知识专题✨

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.防止旧的重复分段干扰新连接