---恢复内容开始---
坞无尘水槛清,相思迢递隔重城。
秋阴不散霜飞晚,留得枯荷听雨声。 --李商隐
上一篇中我们了解了socket编程是基于TCP或者UDP,所以我们有必要对TCP,和UDP先进行学习。本篇主要学TCP.
1.TCP属于那一层?
传输层
2.TCP的定义
TCP是 可靠的(如何可靠), 面向连接(三次握手和四次释放) 字节流(每个TCP报文都带着若干个字节) 服务;
a.先说面向连接
(1)三次握手和四次握手(看图说清楚)
http://blog.csdn.net/fw0124/article/details/7452695
(2)连接3次,释放4次。
为什么连接不是4次? ack和syn 一块发来了。
为什么不是2次?防止过期syn到服务器端。两次就会建立一个不应该存在的连接
3次还有什么漏洞? syn flood,说白了,利用3次握手漏洞,故意不发送最后的ack,这样服务器会有短暂的几分钟的资源浪费,大量的请求,服务器就不能用了。
2msl干啥的? msl最大段生存时间,防止最后的ACK,服务器没收到,所以留下这个时间可以利用tcp的超时重传机制。
b.可靠的
1.分割,我们从应用程序得到的数据会被分割成若干个合适的TCP报文,TCP报文的大小是有上限的(MSS http://support.huawei.com/ecommunity/bbs/10156527.html).
2.分割后,传到IP层加上IP头,成为IP报文,我们知道IP协议是不可靠地,不保证到达顺序,不保证不会出错,不保证不会重复,不保证一定会受到。
3.所以
TCP 可靠体现在: 1.保证报文的有序性,自行组装。 2.使用校验码就行校验。3.重复数据去掉,4,如果到达服务器段,则使用ack,规定时间没到则超时重传。
最后TCP会根据当前的网络的拥塞情况选择一定的流量控制方法。关于流量控制,此处不提了,有空再说。(这也就是TCP与UDP的区别);
c字节流
知道一点足矣,TCP是中的数据段是若干个自己就行。其实从java的socket中看到getInputStream就能感受到了。
原文:http://www.cnblogs.com/hansongjiang/p/3824676.html