socket
既能读又能写,就是全双工ECE: 为1时,表示网络拥堵
URG: 为1时,表示包中需要紧急处理的数据,
ACK: 为1时,确认应答的字段变为有效
PSH: 为1时,需要将收到的数据立刻传入上层应用协议,为0时,则不需要立刻传而是先进行缓存
RST: 为1时,表示与TCP连接中出现异常必须强制断开连接,复位报文段
SYN: 为1时,表示希望建立连接.带SYN标识的称为同步报文段
FIN: 为1时,表示不会再有数据发送,希望断开连接.带FIN标识的为结束报文段
在TCP中,当发送端发送一个数据到主机中时,接收端就会返回一个已收到的消息通知,这个消息通知就叫确认应答(ACK)
例如,小明跟小强聊天,
小明 -> 小强 : 明天出去玩?
小明 <- 小强 : 收到!
小明 <- 小强 : 明天没时间.
小明 -> 小强 : 收到!
刚刚的情况可能会发生丢包的情况: ① 发送端丢包 ② 确认应答丢包
重发超时就是指 在重发数据之前,等待确认应答到来的那个特定时间间隔.如果超过了这个时间间隔还未收到确认应答就会进行数据重发.
但是数据也不会被无限的重发,达到了一定的次数之后,如果仍然没有有任何确认应答,就会判断网络或者对端主机发生了异常,强制关闭连接.
例如: 丢包的概率位 10%
第一次丢包 10%
第二次丢包 10% * 10% = 1%
第三次丢包 10% * 10% * 10% = 0.1%
丢包次数太多,概率太小,就是别的问题了.
可以使用TCP首部用于控制的字段来管理TCP连接. 一个连接的建立与断开,正常过程至少需要来回发送7个包才能完成(三次握手,四次挥手).
为了解决(TCP以一个段位单位发送.这样的通信性能就大大降低了.)这个问题,引入了窗口.
在这种情况下,数据已经到达了对端,此时就不需要再进行重发.如图
这里看出就算丢了1001的ACK,2001的ACK,后面收到了3001的ACK的时候,也会知道收到了数据,就不会受影响.
如果发送端主机如果连续3次收到同一个确认应答,就会将其所对应的数据进行重发.这种机制比超时管理更高效,称为高速重发控制
接收端处理数据的速度是有限的。如果发送端发的太快,导致接收端的缓冲区被打满,这个时候如果发
送端继续发送,就会造成丢包,继而引起丢包重传等等一系列连锁反应。
为了防止这种现象,TCP提供了一种机制可以让发送端根据接收端的实际接收能力控制发送的数据量。这就是流量控制。
在网络出现拥堵时,如果突然发送一个较大量的数据,极有可能会导致整个网络的瘫痪。
TCP为了防止这个问题,在通信一开始就会通过一个叫作 慢启动 的算法得出的数值,对发送数据量进行控制。
当网络通畅时,就逐渐加大发送速率
当网络出现丢包的时候,就立即降低发送速率
真实窗口大小 = min(流量窗口,拥塞窗口)
接收数据的主机如果每次都立刻回复确认应答的话,可能会返回一个较小的窗口.那是因为刚接收完数据,缓冲区已满.
当某个接收端收到这个小窗口的通知以后,会以它为上限发送数据,从而又降低了网络的利用率,
为此引入了一个方法,那就是收到数据后并不立即返回确认应答,而是延迟一段时间的机制.
TCP文件传输中,绝大多数是每两个数据段返回一次确认应答
在延迟应答的基础上,我们发现,很多情况下,客户端服务器在应用层也是 “一发一收” 的。意味着客户端给服务器说了 “How are you”,服务器也会给客户端回一个 “Fine, thank you”;
那么这个时候ACK就可以搭顺风车,和服务器回应的 “Fine,thank you” 一起回给客户端
在通信中,TCP的确认应答和回执数据可以通过一个包发送.
由于这种情况,四次挥手有可能会变成三次,
进程终止会释放文件描述符,仍然可以发送FIN。和正常关闭没有什么区别
和进程终止的情况相同.(可能四次挥手没有挥完)
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://wangzhi430.blog.csdn.net/article/details/123936158
内容来源于网络,如有侵权,请联系作者删除!