TCP协议

TCP协议

一 TCP报文段

在这里插入图片描述

TCP报文格式
TCP报文首部部分项解释:

1.序号:指的是本报文段所发送的数据的第一个字节的需要。如果过是发送的是建立连接时的第一个报文段,则序号任意。
2.确认号:指的是希望收到对方下一个报文段的第一个数据字节的序号。
3.数据偏移:指的是TCP报文段的数据起始处距离TCP报文段的起始处有多远。它实际指出的是报文段首部的长度。
4.ACK:仅当ACK = 1时确认号字段才有效,当ACK = 0时,确认号无效。TCP规定,在建立连接后所有传送的报文段都必须把ACK置1。
5.PSH:当PSH被置1时,表明发送方希望接收方尽快地将此报文交付给应用进程,不用等到整个缓存都填满了再向上交付。
6.RST:当RST = 1时,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立运输连接。
7.SYN:当SYN = 1,而ACK = 0时,表明这是一个连接请求报文段。若对方同意建立连接,则再响应的报文段中使SYN = 1,ACK = 1。SYN置1,就表明这是一个连接请求或连接接受报文。
8.FIN:当FIN = 1时,表明此报文段的发送方的数据已经发送完毕,并要求释放运输连接。
9.窗口:值的是发送本报文段的一方的接收窗口。窗口值告诉对方,从本报文段首部中的确认号起,接收方目前允许对方发送的数据量(以字节为单位)。
10.选项:选项中可能会有MSS字段。它是最大报文段长度,指每一个TCP报文段中的数据字段的最大长度。MSS是可修改的,发送双方的MSS也可以不同。MSS的默认值是536字节长。

二 TCP的有限状态机

在这里插入图片描述

TCP的有限状态机

三 TCP的连接——三次握手

在这里插入图片描述

用三报文握手建立TCP连接

当客户端和服务器端的TCB刚被创建的时候,状态都是CLOSED。
三次握手的过程:
1.当客户端发送第一个报文时,状态转换为SYN-SENT。发送的报文首部内容是SYN = 1, seq任选一个值,如x。SYN报文段(SYN = 1的报文段)不能携带数据,但是要消耗掉一个序号。
2.当服务器端的CLOSED的TCB被listen函数处理时,此TCB被转换为LISTEN。当服务器接收到连接请求报文段后,如果服务器同意建立连接,则立即生成一个新的TCB,这个TCB的状态是SYN-RCVD,然后服务器返回一个确认报文段。确认报文段中SYN和ACK位都置1,确认号是x+1。同时自己也可以选择任意一个初始序号,如seq = y。这个报文段同样不能携带数据,但需要消耗掉一个序号。服务器发送这个确认报文段有两个目的,1是确认客户端发来的报文已经收到,2是希望客户端给自己也发一个确认报文,以证明服务器到客户可以联通。这个新创建的TCB被加入半连接队列。
3.当TCP客户端收到确认报文段后,状态转换为ESTABLISHED并向服务器发送一个确认报文段,其中ACK = 1,确认号是y + 1, seq = x + 1。ACK报文段(ACK = 1,SYN = 0)可以携带数据,但如果不携带数据,则不消耗序号。当服务器收到确认报文段时,服务器将相应的TCB从半连接队列中转移到全连接队列中,且这个TCB的状态是ESTABLISHED。

四 TCP的释放——四次挥手

在这里插入图片描述

TCP连接释放的过程
**四次挥手的过程:**

此时客户端和服务器的TCB都处于ESTABLISHED的状态。
1.客户端先向服务器发出连接释放报文,并停止再发送数据。这时客户端TCP的状态是FIN-WAIT-1。连接释放报文段首部的FIN = 1,其序号seq = u。u是它前面已传送过的数据的最后一个字节的序号加1。连接释放报文段即使不携带数据,它也要消耗掉一个序号。
2.服务器TCP接收到连接释放报文后,回复一个确认报文。状态变为CLOSEWAIT。这时的TCP连接处于半关闭状态。此时服务器可能会向客户端发送一些数据,客户端会接收它。
3.当服务器没有需要向客户端发送的数据的时候,服务器会向客户端发送连接释放报文段。此时服务器会变成LASTACK状态。
4.当客户端接收到连接释放报文段的时候,会发送确认报文段,并将状态置为TIMEWAIT。当服务器收到确认报文段时,正式关闭TCB,状态被置为CLOSED。客户端的TCP连接经过时间等待计时器设置的时间2MSL后,客户端的TCP才会进入CLOSED状态。一般MSL被设置为2分钟。

客户端需要等待的原因一般为:
1)为了保证发送的最后一个确认报文段能够到达B。

保活计时器:也叫TCP的Keepalive。应对客户端出现故障的情况。当TCP建立完成后,服务器每次收到一次客户的数据,就重新设置保活计时器,时间通常是2小时。如果两个小时内都没有收到客户的数据,服务器就会发送一个探测报文段,以后每隔75s发送一个。当连续发送10个探测报文段仍无相应,服务器就认为客户端出了故障,就会单方面关闭连接。

五 TCP的可靠传输的实现原理

TCP的可靠传输是靠连续ARQ实现的。发送方一次可以发送多个分组,只有发送方接收到接收方返回的确认报文段时,才能认定某个分组发送成功了。接收方一般都是采用积累确认的方式。积累确认指的是接收方不必对每个到达的分组都发送确认,而是在收到几个分组后,对按序到达的最后一个分组发送确认。被确认的分组之后的分组都需要重传。

超时重传:当发送方没有在规定时间内接收到接收方发送的确认数据报时,就认定发送的数据丢失,去重新发送它。超时时间是RTO。RTO有一套计算公式,这里不再详述。

六 TCP的流量控制

一般来说,我们希望数据传输的快一些,但是如果传输太快,接收方可能来不及接收数据,会造成数据的丢失。所谓的流浪控制,就是让发送方发送的速率不要太快,要让接收方来得及接收。TCP利用滑动窗口实现流量控制。
当接收方接收到发送方发送的数据后,会返回一个确认,这个确认里面包含当前滑动窗口的大小。滑动窗口的大小表明最多还能接收多少数据。当滑动窗口为0时,发送方停止发送数据。
当发送方因为接收方发来的滑动窗口为0后停止发送数据,发送方会每个一段时间发送探测报文段,如果接收方滑动窗口不为0,接收方就会会返回一个确认值,并附带现在的滑动窗口大小。如果滑动窗口还是0,就无视这个探测报文段。这个间隔由持续计时器决定。

七 TCP的拥塞控制

拥塞控制指的是防止过多的数据注入到网络中。
TCP进行拥塞控制的算法:慢开始,拥塞避免,快重传,快恢复。

慢开始算法:发送方让自己的发送窗口等于拥塞窗口。最初拥塞窗口的大小为1(单位为MSS),只发一个报文段,之后每经过一个传输轮次,拥塞窗口的大小就加倍。为了防止一次发送太多报文段拥塞网络,还要设置一个慢开始门限。慢开始门限指的是当一次发送的报文段的数量大于门限时,开始使用拥塞避免算法。

拥塞避免算法:就是一个轮次拥塞窗口的大小只增加1。当出现一个轮次中发送方没有接全对发送数据的确认,就认为出现了网络拥塞。这时,当慢开始门限被修改为当前拥塞窗口的2分之1。在下一轮的轮次中,重新启动慢开始算法。当发送方通过快重传算法一连收到三个对同一个报文段的重复确认,会在下一轮中启动快快恢复算法。

快重传算法:采用快重传算法可以让发送方尽早知道发生了个别报文段的丢失。快重传算法要求接收方对收到的数据立即确认,即使收到了失序的报文段。这可以让发送方知道只丢失了个别的报文。

快恢复算法:发送方将拥塞窗口设置为和当前拥塞窗口的一般,然后执行拥塞避免算法。

TCP发送1Mb数据的全过程

在这里插入图片描述

TCP发送1Mb数据的全过程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值