TCP提供全双工通信
TCP是面向字节流的 (1)TCP把每个字节都编上了序号 (2)TCP要求把每个序号都发送回ACK报文
TCP报文头 (1)源端口,目的端口占4字节:表示操作系统上的0~\(2^{16}端口范围\) (2)序号:报文第一个字节的序号(4字节) (3)确认号:即将收到的对方返回报文中的序号(这个序号由对方主机维护)(4字节) 【注】:服务端和客户端的区分是用端口来区分的。 (4)数据偏移:4bit 指出TCP报文段的数据部分距报文段的起始处有多远。单位是32位字 (5)连续的6bit标记位: URG:数据是否需要紧急发送 ACK:确认字段是否有效。 ACK=1,上面的确认号才有用 PSH:当收到的报文中PSH=1,接收方不等到缓冲区满就把报文交付到上层。 RST:当RST=1,表明TCP连接必须先释放再重新建立 SYN:当SYN=1,表明这是一个连接请求或连接接受 FIN:用来释放一个连接。 (6)窗口:2字节 用来让对方设置发送窗口的大小 (7)紧急指针:16bit 用来指出此报文段中紧急数据站多少字节
传输连接需要三个过程 (1)连接建立 (2)数据传送 (3)连接释放
连接过程需要解决3个问题: (1)使每一方能够确认对方的存在 (2)允许双方确认一些参数(eg:最大报文段长度,最大发送窗口大小,服务质量等) (3)对传输实体资源进行分配(eg:缓存大小,连接表中的项目等)
TCP3报文连接过程 (1)第一条报文:SYN=1,声明自己是测试连接报文。 (2)第二条报文:SYN=1,ACK=1,并给出自己的seq序号和ack期望对方的序号。表明自己已经接受到了第一条报文。 (3)第三条报文:ACK=1,设置自己的seq序号和希望对方的序号。自己的seq,说明已经接受到了第二条报文 (4)开始传输数据 。 。 。
TCP释放连接 当乙方请求释放连接时,先声明自己已经没有要传输的数据了,FIN=1;然后对方如果还有数据还能发送,直到发送完毕,对方也把FIN设置为1.连接即可释放
流量控制:rwnd (1)发送窗口的滑动收到接收窗口的制约: (2)接收方返回的报文中,会带有rwnd=100。表示接受窗口大小为100,此时发送方接收到报文后,就会调整自己的发送窗口为100
拥塞控制:cwnd(congestion window) (1)发送方:根据拥塞窗口cwnd的大小动态改变自己的发送窗口大小 (2)拥塞窗口的大小取决于网络的拥塞程度,在动态的改变。发送方让自己的发送窗口等于拥塞窗口,考虑到接收方的接收能力,发送窗口的大小可能小于拥塞窗口 (3)发送方控制拥塞窗口的原则是:只要网络没拥塞,拥塞窗口就可以再增大一些,以便把更多的报文发送出去。但只要网络出现拥塞,拥塞窗口就减小一些,以减少发送到网络中的分组数。
慢开始原理 (1)在主机刚刚开始发送报文段时,先设置拥塞窗口cwnd=1.即设置一个最大报文段MSS。 (2)随后,每收到一个对新报文段的确认后,拥塞窗口×2,即增加一个MSS的数值 (3)用这种方法逐步增大发送段的拥塞窗口cwnd,可以使分组诸如到网络的速率更加合理(慢开始并不慢) (4)sstresh门限值: i. 当 cwnd < sstresh 时,使用慢开始算法 ii. 当 cwnd >= sstresh 时,使用拥塞避免算法:每次只增加一个MSS (5)无论在慢开始还是在拥塞阶段,只要发送方出现拥塞(其根据是没有按时收到确认),就把慢开始门限sstresh设置为出现拥塞时的发送方窗口值的一半,然后把拥塞窗口cwnd的值设为1,执行慢开始算法。
快重传,快恢复算法 (1)当发送端连续收到三个重复的确认帧时,就执行“乘法减小”,把慢开始的ssthresh减半,但并不是把拥塞窗口设置为1.因为发送方现在认为网络很可能还没发生拥塞,因此现在不执行慢开始算法,即拥塞窗口cwnd的值设置为慢开始门限sstresh的一半,然后执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢的线性增大。 (2)发送窗口的值为 Min { cwnd , rwnd }
转载于:https://www.cnblogs.com/moonlord/p/5944202.html