赞
踩
目录
URG:紧急指针是否有效
ACK:确认号是否有效
PSH:提示接收端应用程序立刻从TCP缓冲区把数据读走
RST:对方要求重新建立连接,把携带RST标识的称为复位报文段
SYN:请求建立连接,把携带SYN标识的称为同步报文段
FIN:通知对方,要关闭连接了,把携带FIN标识的称为结束报文
TCP协议是对数据传输提供的一个管控机制,主要体现在可靠和效率两个方面,即在保证数据可靠传输的情况下尽可能的提高效率
向对方发送一个数据报,对方要返回一个确认应答的数据报
实现的方式:序号和确认序号保证了响应应答针对的是哪一条消息的应答
说明:
发送的数据报可能因为网络拥堵等原因,超过一定时间,还没有收到确认应答的数据报,就需要重新发送
这种情况,主机B可能会接收到许多重复的数据,TCP内部有去重操作,接收的数据会放在操作系统内核的接收缓冲区中,接收缓冲区可以是一个内存空间,视为是一个阻塞队列,对于收到的数据,TCP会根据序号检查这个数据是不是在缓冲区中已经存在,如果存在则丢弃,如果不存在则放进去
超时时间如何确定?
如果超时时间设置的太长,会导致重传的效率
如果超时时间设置的太短,会导致频繁发送重复的数据
因此TCP协议为了保证在任何环境中都能有较高性能的通信,系统会动态的计算这个超时时间
真正发送数据之前,要先通过三次握手建立连接,不需要发送数据了,通过四次挥手断开连接
三次握手
三次握手主要是为了检查当前网络的情况是否满足可靠运输的基本条件,同时也是在检测双方发送和接收数据的能力是否正常
四次挥手
说明:关闭的时候服务端申请关闭或者客户端申请关闭都可以
思考:
答:主要是ACK和FIN的发送时机不同,ACK是操作系统内核响应的(立即执行),而此时服务端还可能在继续发送数据,待处理完数据后由程序调用close方法后才发送FIN
答:如果客户端给服务端的ACK丢包后,服务端得重新给和客户端发送FIN,此时客户端得给服务端应答,所以此时状态不能置为CLOSED,得等待一段时间(2MSL,MSL为网络上任意两点传输的最大时间)确保服务端收到客户端的应答
接收端主机处理数据的速度有限,如果发送端发送数据太快,导致接收端缓冲区被填满,这时,发送端继续发送数据的话就会造成丢包,继而引起丢包重传等一些列连锁反应,因此TCP协议根据接收端接收数据的能力,来决定发送端发送数据的速度,这个机制就叫作流量控制
刚开始发送数据时,由于中间结点的网络情况不清楚,如果贸然发送大量数据,就会造成大量丢包,所以TCP协议引入慢启动的方式,先发少量数据探探路,再决定按照多大速度发送数据
此处引入拥塞窗口,刚开始时,拥塞窗口设置为1,每收到一个ACK时,拥塞窗口加1,每次发送数据的时候,拥塞窗口和流量窗口的较小的值作为实际发送的窗口,即滑动窗口的大小
注意:上述增长方式是指数级别的,指数式增长可以快速接近丢包的极限
拥塞窗口变化的方式
为了不增长那么快,引入一个慢启动的阈值,当拥塞窗口的大小超过了这个阈值,不在按照指数方式增长,而是按照线性方式增长,如下图所示:
开始时,慢启动的阈值为窗口的最大值,线性增长到一定程度时会发生丢包
网络拥塞时,拥塞窗口置1,慢启动阈值变为拥塞窗口/2,重新开始增长
前面的确认应答机制指出,对每一个发送的数据都对应有一个ACK确认应答,这样采取一发一收的方式有一个很大的缺点就是效率太差,为了提高效率采用滑动窗口,即一次性发送多个数据
操作系统内核为了维护这个滑动窗口,需要开辟发送缓冲区来记录当前还有哪些数据没有应答,只有应答过的数据才能从缓冲区中删掉
如果出现了丢包,如何确保可靠传输?
这种情况下,部分ACK丢了不要紧,因为可以通过后续的ACK进行确认
说明:
这种机制,即时不超时也会发生重传,称作“高速重发控制”也叫“快重传机制”
如果接收端主机接收到数据时,立刻返回ACK应答,这时候返回的流量窗口就比较小,但是流量窗口越大,网络吞吐量越大,传输效率就越高,所以等待一部分时间,待接收端处理完一部分数据 ,就可以将流量窗口设置为大一点的值,这样网咯吞吐量大,效率高
延迟是为了高吞吐量,但是也不能无限延迟
具体的数量和时间,不同操作系统有差异,一般n取2,超时时间取200ms
服务端接收到客户端的消息后,因为延迟应答机制,导致ACK不一定立即返回,可能ACK返回的时机和应用代码中返回响应的时机重合了,此时九江
TCP是面向字节流的,可以多次的接收和发送,对于应用层来说,一连串的字节数据,不知道从哪到哪算一个完整的应用层数据包,对应发送多少次算一个应用层完整格式的数据,和接收多少次算一个应用层完整格式的数据就不知道了
如何解决粘包问题?明确包的边界
也包括自己写TCP程序时自定义的应用层协议
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。