温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

TCP三次握手、糊涂窗口、粘包问题

发布时间:2020-03-27 18:36:38 来源:网络 阅读:748 作者:zmh009_NAME 栏目:网络安全

这是在学习中的总结,若有错误请大家不吝指正(^.^)

关于TCP/IP的三次握手:

当服务端的状态为LISTEN,客户端的状态为CLOSED时,客户端发起连接

客户端发送有SYN字段报文,此时状态为SYN_SENT状态

服务端接收该报文时,状态处于SYN_REVD状态,并向客户端发送有SYNACK字段的报文

客户端接收到该报文时,状态处于ESTABLISHED(建立)状态,并发送有ACK字段的报文

服务端接收到报文后,状态处于ESTALISHED(建立)状态,并开始数据的交互

 

关于糊涂窗口:

当在网络数据传输中,大量发送含有少量数据的报文(极端情况一个报文只有一字节数据),因为在协议层中对数据是层层封装的过程,因此对于数据来说有大量的协议头,传输开销过大;或接收端在缓存区接受数据过慢;

解决方法:

发送端使用Nagle算法,当发送包长度小于MSS大小时会等待一会,发送条件是:

直到所有发送的小包都有ACK回复且未设置TCP_CORK时;

直到有FIN字段时;

直到数据长度达到MSS时;

直到等待超时(一般200ms);

设置TCP_NODELAY且没有设置TCP_CORK时;(就是不使用优化算法啦)

(当小包的ACK字段接收较快时算法的作用不大)

发送端使用CORK算法,会将小包拼接成大包,是协议头在协议报文的比重减小,发送条件是:

拼接的报文大于MTU或超时;

没有设置TCP_CORK并设置TCP_NODELAY时;(就是不使用优化算法啦)

(当小包的传输时间间隔不短时影响实时性,因为都要等待超时传输)

接收端使用Clark解决,只要有数据到达就确认,但宣布窗口大小为0,直到缓存空间够容纳一个MSS或缓存空间一半已空;

接收端延迟确认,直到缓存空间足够为止,防止TCP发送端窗口的滑动,可以减少通信量,不必确认每个报文段,但延迟的确认会导致重发。

 

关于粘包问题:

因为要解决糊涂窗口而使数据积攒发送,或收端不及时接受缓存区数据而同时接收多个包,会导致发送的原数据接收后拼接在一起无法分离。

解决方法:

当数据传输是一次交互后立即断开(多个Client与一个Server)时,数据无结构时(文件传输,一方发另一方收),使用UDP时(有消息边界)不会产生粘包问题;

发送端设置强制数据立即发送,不必等待缓存区满(无处理优化,效率降低);

接收端优化编程方法,精简接收过程,提高接收优先级等使其接收效率提高(不能完全避免);

接收端按结构字段、人为控制多次接收,然后合并(效率低,对实时场合不适用);


在这里问一下,怎么美化呀TCP三次握手、糊涂窗口、粘包问题,之前看别人的博客很酷炫的TCP三次握手、糊涂窗口、粘包问题

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI