TCP的数据发送和接收
来源:互联网 发布:python绝技pdf 百度云 编辑:程序博客网 时间:2024/05/21 19:50
TCP通信的单位是一个报文,TCP报文包括头部和数据部分,头部最少占用20个字节。运用TCP协议进行通信前需要建立连接(三次握手),数据传输完成后,最后需要断开连接(4次握手)。
TCP发送缓存和接收缓存,TCP发送窗口和接收窗口,以及拥塞窗口。
TCP的可靠传输是通过滑动窗口来实现的。TCP的滑动窗口的单位是字节的。
可靠传输
发送窗口中是TCP能够发送的数据和没有已经发送但没有收到确认的数据。发送窗口后沿表示已经发送且已经收到确认的数据,发送窗口前沿表示要发送的数据。发送窗口的越大,表示当接到确认后,能够连续发送的数据越多。发送窗口的大小收到对方接收窗口和拥塞窗口的共同影响。
TCP发送缓冲区有两个作用:
A)用于存储已经发送的,但没收到确认的数据。
B)用于保存应用程序传送给TCP发送缓存的准备发送的数据
接收窗口用于表示现在能够接收的数据。接收窗口后沿表示应用程序能够取走的数据。
TCP接收缓冲区有两个作用:
A)用于存储按序到达,还没有被应用程序取走的数据。
B)用于表示未按序到达的数据。
几个注意:
1)发送窗口的大小根据对方接收窗口和拥塞窗口大小来决定。
2)TCP能够累计确认。
3)TCP没有规定没按序到达的数据的处理方式(是丢掉还是保持在缓冲区中)。
4)在发送端为每一个发送的报文都设有一个计时器,当在计时器时间内没有收到该报文的确认,就重新传送该报文。
5)发送窗口的大小不能超过接收窗口的大小。
流量控制
通过流量控制,可以让发送窗口的发送速率不要太快,流量控制是通过滑动窗口来实现的,其需要用来TCP报文中的窗口字段,该字段会用于标识接收端接收窗口的接收能力,用于设定发送窗口的大小。
解决发送时机的三个机制:
1) 设置一个变量,它等于最大报文段长度,这要缓存的数据达到MSS字节时,就发送出去。
2) 由发送方的应用程序指明要求发送报文段,通过报文的PUH字段来实现。
3) 给发送方设计一个计时器,达到该事件,就将数据发送出去(不能超过MSS)。
Nagle算法:若应用程序将数据逐个字节传送给TCP发送缓冲区,则TCP将第一个字节数据组装成一个报文发送出去。只有当收到该确认报文后,才将缓冲区的所有数据组装成一个报文发送出去。只有收到前一个报文确认才发送下一个报文。Nage算法还规定:当缓冲区的数据已达到发送缓冲区一般或超过报文最大长度时,就立即发送一个报文段。
为了解决糊涂窗口综合症,可以让接受端等待一段时间、或者让接受缓存已有足够空间容纳一个最长报文段,或者等到接收缓冲已有一半空闲的空间,满足其一,就发送确认报文。
拥塞控制
发送方会有一个拥塞窗口,用于和接收窗口一起控制发送窗口的大小。发送窗口的大小取拥塞窗口和接收窗口中值较小的一个。
门阀值。
慢开始算法:拥塞窗口的大小从1开始逐渐增加增加到一倍。
拥塞避免算法:当执行慢开始算法时,拥塞窗口大于门阀值时,拥塞窗口的大小每次加一。
不管是慢开始算法还是拥塞避免算法,当出现拥塞时(即没有按时收到确认),就将门阀值减半,拥塞窗口在变为1执行慢开始算法。
快重传算法:是指接收方每收到一个失序的报文时,就发送一次重复确认(确认值为前面按序到达的报文最后一个数据值加1)。当发送方累计收到3次重复确认时,就立即再次发送未被确认的报文,而不必等待计时器到期在发送。
快恢复算法:是指到收到上次重复确认时,就立即将门阀值减半,并执行拥塞避免算法,起始值为门阀值或门阀值+3*MSS。
- TCP的数据发送和接收
- TCP的数据发送和接收
- tcp发送和接收的原理
- TCP发送接收数据(一)
- java 简单的TCP接收数据与发送数据
- C#使用Socket发送和接收TCP数据示例
- 十.TCP与UDP发送和接收数据的简单实现
- UDP和TCP通信机制(实现简单的数据发送与接收)
- 数据发送和接收
- TCP模拟串口十六进制数据的发送与接收
- socket数据的接收和发送
- kafka的数据发送和接收java_API
- Windows下数据的接收和发送
- 应用间的数据接收和发送
- 8、socket数据的接收和发送
- kafka的数据发送和接收java_API
- mailbox数据发送和接收的过程
- 基于TCP协议的发送和接收端
- gdb core dumped
- 苹果证书常出现的问题
- NYOJ - 水池数目(DFS)
- @PathVariable和@RequestParam的区别
- 归档数据的读写方法。。。
- TCP的数据发送和接收
- java--内省
- VBS 数据类型的说明
- asp.net程序集编绎dll并且引用的问题!(自己备用)
- python 集合比较(交集、并集,差集)
- 12中灵感创意爆发的单页面
- Linux配置svn以及TortoiseSVN的安装和使用
- /lib/libQtGui.so: undefined reference to `ts_read_raw'
- Linux中的.rc文件介绍