流量控制--滑动窗口

news/2024/5/17 18:00:18 标签: tcp, stream, 通讯

问题:如果发送端发送的速度较接收端接收到数据后处理的速度较,而接收缓冲区的大小是固定的,就会丢失数据惊恐TCP协议通过''滑动窗口SlidingWindow)''机制解决这一问题。

 

                                                                  

 

1. 发送端发起连接,声明最大段尺寸是1460,初始序号是0,窗口大小是4K,表示“我的接收缓冲区还有4K字节空闲,你发的数据不要超过4K”。接收端应答连接请求,声明最大段尺寸是1024,初始序号是8000,窗口大小是6K。发送端应答,三方握手结束。
2. 发送端发出段4-9,每个段带1K的数据,发送端根据窗口大小知道接收端的缓冲区满了,因此停止发送数据。
3. 接收端的应用程序提走2K数据,接收缓冲区又有了2K空闲,接收端发出段10,在应答已收到6K数据的同时声明窗口大小为2K。
4. 接收端的应用程序又提走2K数据,接收缓冲区有4K空闲,接收端发出段11,重新声明窗口大小为4K。
5. 发送端发出段12-13,每个段带2K数据,段13同时还包含FIN位。
6. 接收端应答接收到的2K数据(6145-8192),再加上FIN位占一个序号8193,因此应答序号是8194,连接处于半关闭状态,接收端同时声明窗口大小为2K。
7. 接收端的应用程序提走2K数据,接收端重新声明窗口大小为4K。
8. 接收端的应用程序提走剩下的2K数据,接收缓冲区全空,接收端重新声明窗口大小为6K。
9. 接收端的应用程序在提走全部数据后,决定关闭连接,发出段17包含FIN位,发送端应答,连接完全关闭。

 

发送端是一K一K地发送数据,而接收端的应用程序可以两K两K地提走数据,当然也有可能一次提走3K或6K数据,或者一次只提走几个字节的数据,也就是说,应用程序所看到的数据是一个整体,或说是一个流(stream),在底层通讯中这些数据可能被拆成很多数据包来发送,但是一个数据包有多少字节对应用程序是不可见的,因此TCP协议是面向流的协议。而UDP是面向消息的协议,每个UDP段都是一条消息,应用程序必须以消息为单位提取数据,不能一次提取任意字节的数据,这一点和TCP是很不同的。

 

 


http://www.niftyadmin.cn/n/1615853.html

相关文章

PS命令、procfs

进程的UID和GID 进程的PID 创建进程时系统为每一个进程自动分配一个整数,用于进程身份识别每个进程的PID在内核中是唯一的,不能重复PID资源有限:cat /proc/sys/kernel/pid_maxPPID:该进程父进程的ID号ps -O pid,ppid,tty,cmd //…

乔布斯与Google鲜为人知的故事

据悉,即将上市的《史蒂夫乔布斯传》被提前曝光了部分内容,其中有一段是关于Google的:“如有必要,我会用尽最后一口气,花光苹果400亿美金的积蓄,摧毁Android,因为那是偷来的产品。” 这段话如此地…

进程组与会话

进程组与会话 进程组 什么是进程组? 进程组:一组协同工作或关联进程的集合,每个进程组有ID(PGID)每个进程属于一个进程组,每一个进程组有一个进程组长,该进程组长ID(PID)与进程组ID(PGID)相同一个信号可以发送给进程组的所有进…

平板市场,谁能赶超iPad?

从2001年苹果推出iPod开始,就一直在打造一个全新的产品类别了。直到2010年,iPod依然占据着mp3市场上7成的份额。而在2007年iPhone推出的时候,智能机领域的大佬们纷纷从领先变成了追赶。去年iPad的推出,苹果又成为了行业的领头羊&a…

TCP协议通讯流程

服务器调用socket()、bind()、listen()完成初始化后,调用accept()阻塞等待,处于监听端口的状态,客户端调用socket()初始化后,调用connect()发出SYN段并阻塞等待服务器应答,服务器应答一个SYN-ACK段,客户端收…

前台进程与后台进程

前台进程与后台进程 进程的前后台 前台进程:占有控制终端的进程,其它称为后台进程后台进程: shell中耗时较久的命令可以通过command**&**后台运行好处:下一个命令不必等到上一个进程运行完才能运行一个子进程在创建时若没指…

Google TV 2.0 实测画面曝光

原版的Google TV机顶盒的销售成绩并不理想,所以吸取这次的教训之后,Google调整了Google TV界面并加入了“蜂巢”3.1系统的部分功能,再过几周相信就会正式发布新的Google TV2.0。如果觉得连几周的时间都无法忍耐,就先看看日前曝光的…

socket简单编程

server.c:从客户端读字符,然后将每个字符转换为大写并回送给客户端。 client.c:从命令行参数中获得一个字符串发给服务器,然后接收服务器返回的字符串并打印。 others... 1.该例子不仅功能简单,而且简单到几乎没有什么错误处理,我…