TCP的性质
----报文格式、连接释放、滑动窗口、流量控制和拥塞控制、差错控制
1.TCP报文格式
(1)TCP的固定首部长度为20字节,5行,一行是4字节,即32位。TCP首部的最长长度为60,由首部长度(4位,数据偏移(选项))确认,因为首部长度为4位,所以最大十进制是15,所以最大偏移是15*4字节=60字节,即最大可以15行
选项长度不能超过40字节。所以TCP首部包含的字节数为((4字节 x 5 )+ (0~40字节))
(2)TCP有6个控制位:URC:紧急比特(优先处理本段数据)
ACK:确认比特(正确接收的确认信号)----TCP三次握手
PSH: 推送比特
RST:复位比特
SYN:同步比特(用于初始化TCP连接时同步源系统和目的系统之间序号。SYN=1,ACK=0.表明这是一个连接请求报文段;SYN=1,ACK=1,表明这是一个连接请求接收报文段)-----TCP三次握手建立连接
FIN:终止比特(等于1时表明数据已经发送完毕,请求释放)-----TCP四次握手释放
(3)窗口:定义了对方必须维持的窗口大小(字节单位),一般称为接收窗口,它由接收方确定。此时,发送方必须服从接收端的支配,应用有TCP的滑动窗口机制
(4)校验和:和UDP的校验和一样的计算过程,即
假如源端A要发送3个16位的二进制:word1,word2,word3到终端B
计算过程如下:
1.先将16位的校验码字段全填0,为word4
计算发送前的sum=word1+word2+word3+word4
2.sum取反码
3.按道理,sum+word1+word2+word3=FFFF,在传输过程中,如果出现数据丢失等错误,则sum+word1+word2+word3 != FFFF,就说明传输出现差错,等于就说明没错
2.TCP的连接管理
(1)TCP的三次握手
过程:
-
通俗说法:1.客户发送请求连接信号给服务器,说我要连接你。2.服务器接收后,说好,来连接。3.客户端说,好开始吧
-
原理说法:
-
客户端发送同步比特SYN请求连接服务器,并把客户端的初始序列号seq发送给服务器
-
服务器接收后,发送确认信号ACK和发送SYN,把自己的初始序列号和接收到的客户端的初始序列号+1发送给客户端
-
客户端接收后,确认服务器可以连接,返回ACK,建立TCP连接
-
(2)TCP的四次握手释放
过程
-
通俗说法:1.客户端对服务器说,我没有数据要收发了,我们断开连接吧 2.服务器还数据没发送完,所以对客户端说:我收到你请求了,我还没准备好,你等等 3.服务器准备好了,说:来吧,可以关闭了 4.客户端说:那我关了啊,你别后悔 ,等了 2MSL后没有收到回复,就知道服务器关闭了,那我也关闭
-
原理说法:假设Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK,"告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息"。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,"告诉Client端,好了,我这边数据发完了,准备好关闭连接了"。Client端收到FIN报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。“,Server端收到ACK后,"就知道可以断开连接了"。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!
3.TCP的滑动窗口机制
(1)先讲将流量控制:流量控制是为了限制发送速率,使得接收速率和发送速率相当,不会造成因为来不及接收数据而造成数据丢失的控制机制
(2)滑动窗口机制是达到流量控制的一种方法
对于发送窗口的规则
-
规定窗口大小,即数据分组个数
-
如果窗口内的分组有已发送但未被接收端确认的,窗口不动
-
如果发送端接收到接收端的一个分组的确认信号后,就滑动一个分组的位置
-
发送端设置了一个超时计时器,当计时器满而为接收到应答,就重发分组
对于接收窗口的规则
-
只有当接收到的分组序号落入接收窗口内才允许收下,否则丢弃它
-
当接收方接收一个序号正确的分组,接收窗口向前滑动,并向发送端发送对该分组的确认信号。
停止——等待协议(发送出错,丢失,没有ACK都重发),后退N协议(1个出错,后面的都不接收,等那个重发后,重发后面的),和选择重传协议(加大接收窗口)3个协议以及滑动窗口,可变窗口都可以实现流量控制
4.TCP的流量控制和拥塞控制
(1)TCP的流量控制
所谓的流量控制就是让发送方的发送速率不要太快,让接收方来得及接受。利用滑动窗口机制可以很方便的在TCP连接上实现对发送方的流量控制。TCP的窗口单位是字节,不是报文段,发送方的发送窗口不能超过接收方给出的接收窗口的数值。
下面是可变窗口大小控制流量 控制
如图所示,说明了利用可变窗口大小进行流量控制。设主机A向主机B发送数据。双方确定的窗口值是400.再设每一个报文段为100字节长,序号的初始值为seq=1,图中的箭头上面大写ACK,表示首部中的却认为为ACK,小写ack表示确认字段的值。
接收方的主机B进行了三次流量控制。第一次把窗口设置为rwind=300,第二次减小到rwind=100最后减到rwind=0,即不允许发送方再发送过数据了。这种使发送方暂停发送的状态将持续到主机B重新发出一个新的窗口值为止。
假如,B向A发送了零窗口的报文段后不久,B的接收缓存又有了一些存储空间。于是B向A发送了rwind=400的报文段,然而这个报文段在传送中丢失 了。A一直等待收到B发送的非零窗口的通知,而B也一直等待A发送的数据。这样就死锁了。为了解决这种死锁状态,TCP为每个连接设有一个持续计时器。只 要TCP连接的一方收到对方的零窗口通知,就启动持续计时器,若持续计时器设置的时间到期,就发送一个零窗口探测报文段(仅携带1字节的数据),而对方就在确认这个探测报文段时给出了现在的窗口值。
(2)TCP的拥塞控制
https://www.cnblogs.com/wuchanming/p/4422779.html
一.拥塞
1.概念:在某段时间,如果对网络中的某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要发生变化,这种情况叫阻塞
2.拥塞控制: 防止过多的数据注入到网络当中,这样可以使网络中的路由器或链路不致过载。(通过拥塞窗口处理网络拥塞现象的一种机制)
(拥塞控制是一个全局性的过程,涉及到所有的主机、路由器,以及与降低1网络传输性能有关的所有因素。
与流量控制的区别:流量控制往往是指点对点通信量的控制,是个端到端的问题。流量控制所要做的就是控制发送端发送数据的速率,以便使接收端来得及接 收。)
3.拥塞控制方法:
慢开始 拥塞避免 快重传 快恢复
发送方维持一个叫做拥塞窗口cwnd(congestion window)的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。发送方让自己的发送窗口等于拥塞窗口,另外考虑到接受方的接收能力,发送窗口可能小于拥塞窗口。
慢开始与拥塞避免
-
慢开始算法:不要一开始就发送大量的数据,先探测一下网络的拥塞程度,也就是说由小到大逐渐增加拥塞窗口的大小。----指数增长
当然收到单个确认但此确认多个数据报的时候就加相应的数值。所以一次传输轮次之后拥塞窗口就加倍。这就是乘法增长,和后面的拥塞避免算法的加法增长比较。
-
拥塞避免算法:让拥塞窗口以线性规律缓慢增长
为了防止cwnd增长过大引起网络拥塞,还需设置一个慢开始门限ssthresh状态变量。ssthresh的用法如下:
当cwnd<ssthresh时,使用慢开始算法。
当cwnd>ssthresh时,改用拥塞避免算法。
当cwnd=ssthresh时,慢开始与拥塞避免算法任意。
无论是在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有收到确认,虽然没有收到确认可能是其他原因的分组丢失,但是因为无法判定,所以都当做拥塞来处 理),就把慢开始门限设置为出现拥塞时的发送窗口大小的一半。然后把拥塞窗口设置为1,执行慢开始算法。如下图:
再次提醒这里只是为了讨论方便而将拥塞窗口大小的单位改为数据报的个数,实际上应当是字节
快重传和快恢复
-
快重传算法: 快重传要求接收方在收到一个失序的报文段后就立即发出三个重复确认(为的是使发送方及早知道有报文段没有到达对方)
快重传算法规定,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计时器时间到期。如下图:
-
快恢复算法
快重传配合使用的还有快恢复算法,有以下两个要点:
①当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把ssthresh门限减半。但是接下去并不执行慢开始算法。
②考虑到如果网络出现拥塞的话就不会收到好几个重复的确认,所以发送方现在认为网络可能没有出现拥塞。所以此时不执行慢开始算法,而是将cwnd设置为ssthresh的大小,然后执行拥塞避免算法。如下图:
5.TCP的差错控制
TCP的差错控制主要使用校验和、确认、超时重传这三个工具进行差错控制。
校验和主要用来检验数据报文是否受到损伤。如果校验和无效,报文就会在终点被丢弃。
确认是接收端用来证实确实收到了报文,在TCP中,使用的是累计确认,接收端会告诉发送端其下一个希望接收的字节编号。
超时重传是差错控制的核心。实际上当发送端发送一段字节的数据后,会把这个报文段保存在一个队列中,并启动一个计时器,这个计时器也叫RTO(重传计时器),若计时器超时发送端还没有收到接收端的ACK确认,那么发送端会把队列中的首部报文重新发送。当然RTO的值是动态的,与RTT有关,RTT是一个报文自发送到接收端返回确认的时间。如果RTO的值不是很大。使用简单的超时重传也就够了,但是如果RTO的值足够大,再使用超时重传就不太切实际了。
---TCP是这样处理的:如果发送端连续收到三个重复的超时重传ACK,那么发送端可以不必等待计时器到达而选择马上重传报文段,这种机制也称为快重传。
UDP的性质
1.无连接服务、不可靠传输
2.没有流量控制、窗口机制
3.除了校验和外,没有差错控制机制
4.无拥塞控制
TCP/IP 和UDP区别
1.TCP/IP是可靠连接的,UDP是不可靠连接的。通俗一点说就是:TCP/IP管发管到,UDP管发不管到。因此,在安全性方面来说,TCP/IP更具有优越性。
2. TCP连接传送的数据,无差错,不丢失、顺序正确, UDP尽最大努力交付,即不保证可靠交付
3.UDP传输速率比TCP快很多
4. TCP对系统资源要求较多,UDP对系统资源要求较少。
(3.4点解释,因为TCP有各种拥塞控制算法,握手过程等,TCP一旦丢包,延时大)
5.UDP适合实时传输,TCP不适合(因为TCP是依赖滑动窗口进行流量控制,一旦网络丢包,滑动窗口将减少到原来的一半,因此速率也会减半 此时发送速率将小于数据生产速率,一些数据将滞留在发送端,然后滑动窗口将不断增大,直到积累的数据全部发送完毕。上述过程即为典型的TCP流量抖动过程,对于实时传输影响很大,可能形成较大的突发时延,从用户感观角度来说,就是有时比较流畅,但有时卡(“抖一下”,并且比较严重),因此实时传输通常不使用TCP。)
6. TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
应用场景:
比如普通的会议视频图像,当然首选UDP,毕竟丢几包无所谓。
如果传输文件等,不能丢包,用TCP
3.TCP与IP的区别
TCP:(传输层)又叫传输控制协议(Transmission Control Protocal)是一种面向连接的、端对端的、可靠的、基于IP的传输层协议。主要特点是3次握手建立连接,4次挥手断开连接。
IP:又叫因特网协议(Internet Protocol),IP协议位于网络层,IP协议规定了数据传输时的基本单元(数据包)和格式,IP协议还定义了数据包的递交办法和路由选择。
总结:整个网络中的传输流程是:IP层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层—TCP层;相反,IP层也把从TCP接收来的数据包传送到更低层。
TCP和IP的关系是:IP提供基本的数据传送,而高层的TCP对这些数据包做进一步加工,如提供端口号等等。TCP放在IP报文段的数据部分