网络编程
一,网络协议头分析
(1)发生TCP粘包或拆包有很多原因
1、要发送的数据大于TCP发送缓冲区剩余空间大小,将会发生拆包。
2、待发送数据大于MSS(最大报文长度),TCP在传输前将进行拆包。
3、要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出去,将会发生粘包。
4、接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包。
(2)粘包、拆包解决办法:
解决问题的关键在于如何给每个数据包添加边界信息,常用的方法有如下:
1、发送端给每个数据包添加包首部,首部中应该至少包含数据包的长度,这样接收端在接收到数据后,通过读取包首部的长度字段,便知道每一个数据包的实际长度了。
2、发送端将每个数据包封装为固定长度(不够的可以通过补0填充),这样接收端每次从接收缓冲区中读取固定长度的数据就自然而然的把每个数据包拆分开来。
3、可以在数据包之间设置边界,如添加特殊符号,这样,接收端通过这个边界就可以将不同的数据包拆分开。 等等。
4.延时、效率低
(3)三次握手:
1、客户端调用connect给服务器发送一个SYN同步包
2、当服务器接收到客户端发送的SYN同步包,会回一个ACK确认包,同时给客户端发送一个SYN同步包
3、客户端接收到服务器的同步包,回一个ACK确认包,三次握手完成。
服务器段accept返回,客户端connect返回,进行通信
(4)四次挥手:
1、客户端调用close关闭通信会给服务器发一一个FIN结束包
2、服务器端接收到客户端的FIN结束包会给客户端会一个ACK确认包。 recv就会返回等于0.
3、服务器调用close关闭通信文件描述符,给客户端再发送一个FIN结束包。
4、客户端接收到FIN结束包,给服务器回一个ACK确认包,断开连接。