浅入tcp

更新时间:2016-04-26 14:01:54 点击次数:2104次

1.认识TCP

tcp协议是传输层协议,它的主要的3个特点是面向连接、可靠保证、基于字节流。当应用层把数据给tcp层时,注意如果数据大于MSS是要在tcp层进行分段的。tcp协议为了保证不丢包会给每个包一个序号,接受方成功收到数据包后回回复一个确认,这个过程是在小于传输延迟RTT的时间内的。如果发送方在RTT时间内没有收到确认就会重传已丢失的数据包。说到要在tcp层进行分段我就想到老师经常提到以太网数据包的长度要小于或等于1518和大于或等于46字节,但我却还不知道是什么原因。还有一个问题,在tcp层会对数据进行分段,它和分片的区别是什么。

问题一:为什么以太网数据帧大小在64字节和1518字节之间?

可以想象A给B发数据,发送数据这个过程本身是需要时间的,现在已经有部分数据在传输链路上了,B这时也准备发送数据。那么B这时就会检测到冲突并将冲突信号返回给A,如果冲突信号返回给A时,A的数据还没发送完那么A就知道有冲突,这样数据就会选择合适的时间重发。如果冲突信号到达A时A已经把数据发送完了,那么A就不会重传数据了。所以在一个往返时间内,数据不能发送完,因此以太网数据帧小为64字节。如果数据帧太大,一方面其他主机需要长时间等待,一方面可能造成接受方缓冲区溢出,因此数据帧一定要小于一个值,至于为什么是1518那就是数学和其他多方面考虑得出的结果了。

问题二:Tcp层的分片和IP层的分片有什么区别?

我刚开始在TCP百度百科查看到“然后TCP把数据流分区成适当长度的报文段(通常受该计算机连接的网络的数据链路层的大传输单元([1]  MTU)的限制)”这样一句话。我觉得很奇怪,tcp层的分段难道还和数据链路层的MTU有关系,既然已经有了IP分片,tcp层分段有什么意义呢?查阅资料后发现tcp分段是根据大传输单元MSS来进行的,MSS是建立tcp连接后,双方协商的进行通信时所能承受的大数据长度。当使用IP分片时有一个大的缺点那就是一旦丢失一个分片,就会重新传输整个数据报。采用tcp分段的话它的数据长度是要小于MSS的,而MSS是小于MTU的,这样的话就将重传机制就交给tcp负责了。

2.TCP连接建立与释放

昨天参加笔试这个地方就没有答的很深入,只说了一个大概。所以今天得认真的学习下tcp,确实网络挺重要的。tcp连接断开主要是三次握手和四次握手,下面是我总结的一个表格。

建立连接 参数字段 状态
客户端请求服务器 SYN=1,seq=x,SYN报文段不能携带数据。 客户端进入SYN-SENT状态
服务器回复客户端 SYN=1,ACK=1,seq=y,确认号ack=x+1,仍然不能携带数据。 服务器进入SYN-RCVD状态
客户端回应服务器 ACK=1,seq=y+1,确认号ack=x+1。 服务器收到后客户端和服务器同时进入ESTABLISHED状态

 

释放连接 参数字段 状态
A向B发送连接释放报文 FIN=1,seq=u。 A进入FIN-WAIT-1状态,等待B的确认。
B回复确认 ACK=1,seq=v,ack=u+1。 B进入CLOSE-WAIT,这时B的tcp进程通知高层进程去释放连接,B进入半关闭状态,这个时候B不会接受数据但是可能发送数据。
A收到确认后  不会发送数据包  A进入FIN-WAIT-2状态,等待B发出连接释放数据报
 B发送连接释放数据包 FIN=1,ACK=1,seq=w,ack=u+1。   B进入LAST-ACk后确认状态,等待A的确认。
A收到B的连接释放包后,返回确认。 ACK=1,seq=u+1,ack=w+1。  发送数据后,A进入到TIME-WAIT状态,现在TCP连接还没有释放掉,必须经过时间等待计时器设置的时间2MSL(时间等待状态)后A才能进入到CLOSED状态。B收到数据报后也会进入CLOSED状态,这样A和B就断开连接了。

问题三:为什么A在发送确认数据后必须等待2MSL时间呢?

有2个理由,是后一个A发送确认报文后,这个报文有可能丢失。如果B收不到A已发送确认报文那么B会重传FIN+ACK报文段,A经过2MSL的好处就体现在这了,在2MSL内A还可以收到B重传的数据包。A收到重传的数据后会再重传一次确认,重新启动2MSL计时器。第二点是就是可以产生一个延迟,在2MSL时间内可保证本连接持续时间内所产生的报文段从网络中消失,这样就可以使下一个新的连接中不会出现上一次的数据报文段。

3.TCP的可靠性与拥塞控制

TCP的可靠性主要体现在滑动窗口机制和超时重传。tcp的滑动窗口是以字节为单位的,当发送方发送数据时,接收方收到数据后会对收到的数据进行确认,发送方只有收到接收方的确认后才会将滑动窗口向前移动。滑动窗口机制可以保证数据被可靠的接受。每当发送方发送一个数据段时,就会启动一个重传定时器,如果在重传超时前收到确认则会停止定时器,否则就会重传该数据段。另外TCP会保持首部和数据的校验和,当校验和有差错时,TCP将会丢弃这个报文段且不会确认收到此数据包,这样做还有一个目的就是希望发送端超时重传。TCP还能提供流量控制,发送方或接受方会相互通信传递自己的缓冲区大小,这样发送方只会给接收方发送接收方可以容纳的数据,这可以防止缓冲区溢出。

拥塞控制的目的就是为了防止过多的数据注入到网络中,这样可使网络中的路由器或链路不致过度负荷,而且实现拥塞控制的前提是网络可以承受现有的负荷。拥塞控制常常和流量控制搞混淆,我觉得可以从相同点与不同点去看这个问题。本来拥塞控制算法说到底就是告诉发送端你要减慢发送数据了,网络现在有麻烦了你必须降低流量的出口,这点和流量控制是很相似的。但是拥塞控制是一个全局的过程,而流量控制往往是点对点通信量的控制,是端到端的关系。流量控制所要做得事情就是需要发送方减慢发送速度时抑制发送方的发送速度让接收方来得及接受。进行拥塞控制主要是根据一些指标来判断当前网络的状况,比如超时重传的分组数或丢弃的数据包百分比等等。网络系统进行控制肯定是很复杂的,我这里主要是总结课本上的4个算法,了解了网络拥塞控制的基本原理。其中慢开始算法和拥塞控制算法一起结合使用。慢开始、快重传和快恢复结合使用,但是慢开始仅仅在tcp建立连接时和网络出现超时时才使用。

序号 过程描述 发送方 接收方 状态
1 网络正常情况 维持拥塞窗口的状态变量,大小取决于网络的拥塞程度。 做好接受数据的准备, 发送方会让发送窗口大小等于拥塞窗口大小,这个窗口大小是动态变化的且原则是只要没出现网络拥塞,拥塞窗口就会增大一些。
2 发送方开始发送数据 探测拥塞窗口并逐渐由小增大拥塞窗口的数值,当开始发送报文段时会将发送窗口增加为MSS的数值。 接受方对结果进行回复确认 接受方每收到一个新的报文段的确认后就会增加多一个MSS大小的窗口值。这个过程为慢算法,就是每完成一个传输过程,拥塞窗口就会增加。
3 是否达到慢开始门限 为了防止拥塞窗口过度增加会设置一个慢开始门限ssthresh变量。 接受方接受数据 如果拥塞窗口小于ssthresh继续执行慢开始算法,如果是大于则停止使用慢开始算法而改用拥塞避免算法。如果是等于的话两种算法都可以执行。这里假设要改用拥塞避免算法。
4 发送方开始执行拥塞避免算法 发送方的拥塞窗口不会成倍或以较快的速度的增加,而是以一种较小的速率去增加拥塞窗口大小。 接受方对结果进行回复确认 发送方根据动态改变的发送窗口大小发送数据。
5 发送方发现拥塞 发送方没有收到接收方的确认回复 接收方没有收到数据包或者回复数据包被丢失 慢开始门限会直接设置为拥塞时的发送窗口值的一半(它是存在一个小值的),拥塞窗口直接降为初始值开始执行慢开始算法。
6 执行序号2后使用快重传算法 发送方正常发送数据 接收方每收到一个失序的报文段就会立即发出重复确认。  这样接收方就能很快的知道有数据段没有正确的被接收方接受。快重传规定只要接收方连续收到三个重复确认就会赶快重传确认数据包里说明的下一个数据段,而不是等待为丢失报文设置的计时器。
 7  执行快重传算法时会同时执行快恢复算法  现在发送方收到3个重复确认  接收方继续监听数据  发送方会将慢开始门限ssthresh减半,这是为了预防网络发送拥塞,因为发送方没有及时收到正确的数据段序号很有可能是网络出现拥塞。接着不会执行慢开始算法,即不会将拥塞窗口值降为初始值而是为此时ssthresh的数值。

本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是一个个人学习交流的平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽,造成漏登,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

回到顶部
嘿,我来帮您!