tcp/ip

tcp/ip

网络报文传输
在这里插入图片描述
一.tcp报文格式
在这里插入图片描述

1.源端口:源端口与ip是用来识别报文的返回地址。
2.目的端口:指明报文接收方计算机应用程序接口。
tcp报文中的源端口号和目的端口号同ip数据报文中的源ip与目的ip确定一条tcp连接。
3.序号和确认号:是tpc可靠传输的关键,序号是本报文段发送的数据组的第一个字节的序号。在tcp当中,每一个字节都有一个序号,序号确保了传输的有序性。确认号,即ACK,指明下一个期待接收的字节序号,表明在该序号之前的字节都已经准确无误地接收了,确认号只有在ack标志为1时有效。例如:建立连接时第一次握手ack=0.
4.数据偏移/首部长度:由于tcp首部存在可选项,所以tcp报头的长度是不确定的。报文首部不包含任何可选字段长度为20.首部长度指明了数据区在报文段中的起始偏移值。
5.保留:为将来定义新的用途保留,现在一般置0.
6.控制位:URG,ACK,PSH,RST,SYN,FIN共6个。每一个标志位表示一个控制功能。
(1)URG:紧急指针标志,为1时表示紧急指针有效,为0时忽略紧急指针。
(2)ACK:确认号标志,为1时标志确认号有效,为0时忽略确认号。
(3)PUSH:push标志,为1表示带有push标志的数据,接收方在接收到该报文段以后应尽快将该报文段交给应用程序,而不是在缓冲区排队。
(4)RST:重置连接标志,用于重置由于注解崩溃或其他原因而出现的错误连接,或者用来拒绝非法的报文段和拒绝连接请求。
(5)SYN:同步标志,用于建立连接过程,在连接请求当中,SYN=1,ACK=0表示该数据段没有使用捎带的确认域。而连接应答捎带一个确认,即SYN=1,ACK=1。
(6)FIN:finish标志,用于释放连接,为1时表示发送方已经没有数据发送了,即关闭本方数据流。
7。窗口:滑动窗口大小,用于告诉发送端接收端缓存大小,以此控制发送端发送数据的速率,从而达到流量控制。窗口大小是一个16bit字段,因此窗口大小最大为65535.
8.校验和:奇偶校验,此校验和是对整个tcp报文段,包括tcp头部和tcp数据。以16位字进行计算所得,由发送端计算和存储,并由接收端进行验证。
9.紧急指针:只有当URG为1时,紧急指针才有效,紧急指针是一个正的偏移量,紧急指针和顺序号相加表示紧急数据的最后一个字节序号,tcp的紧急方式时发送端给接收端发送紧急数据的一种方式。
10.选项和填充:最常见的可选字段是最大报文长度,又称为MSS(Maximum Segment Size),每个连接方通常在通讯的第一个报文(为建立连接而设置SYN=1的那段报文)指明这个选项,它表示本端能接收的最大报文段的长度,选项长度不一定是32位的整数倍,所以要加填充位,即这个字段加入额外的0,以保证tcp头是32的整数倍。
11.数据部分:tcp报文段中的数据部分是可选的,在一个连接建立和一个连接终止时,双方交换的报文段仅有tcp报文段首部,如果一方没有数据要发送,也使用没有任何数据的首部来确认接收到的数据。在处理超时的许多情况中也会发送不带任何数据的报文段。

二.tcp建立连接三次握手
在这里插入图片描述

三次握手:
1.客户端发送给服务端syn=1与序号seq=j,客户端处于syn_send状态。
2.服务端接收到后响应返回SYN=1,ACK=1,ack=j+1,seq=k,服务端变成syn_recv状态。
3.客户端接收到后检查同步变量与确认变量是否正确,发送ACK=1,ack=k+1,变成established状态。服务端接收到后检查ack是否为k+1,ACK=1,如果是则变更状态为established完成三次握手。

三.tcp连接断开四次挥手
由于tcp是全双工的,因此断开连接时每个方向都必须单独关闭,这一原则是当一方数据发送完成后发送一个FIN来终止这一方的连接,收到FIN的一方知道对方已经没有数据流动了,即不会在接收到数据了,但这一方仍可以发送数据,直到这一方也发送了FIN。首先发送FIN的一方将执行主动关闭,而另一方则执行被动关闭。
在这里插入图片描述

四次挥手:
由于tcp时
1.客户端先发送一个FIN=M,用来关闭客户端到服务段的数据传送,客户端则进入FIN_WAIT_1状态。意思是说“我客户端没有数据要发给你了,但如果你服务端还有数据没有发送完成,则不必急着关闭连接,可以继续发送数据”。
2.服务端接收到FIN后,先发送ack=M+1,告诉客户端,你的请求我接收到了,但我还没准备好,请继续等我消息。这时客户端进入FIN_WAIT_2状态,继续等待服务段FIN消息。
3.服务端确定数据一发送完成,则向客户端发送FIN=N的报文,告诉客户端,好了,我这边数据发完了。准备关闭连接,服务段进入LAST_ACK状态。
4.客户端接收到服务段发送的FIN=N后,就知道可以关闭连接了,客户端回复服务端ack=N+1,服务端接收到ack后就关闭了连接。客户端不相信网络,担心服务端没接受到消息不知道要关闭,所以发送完ack后客户端进入了TIME_WAIT状态。客户端等待2MSL(最长传输时间)后依然没有收到回复,说明服务端已经正常关闭,客户端也进行关闭(如果在TIME_WAIT状态接收到服务端回复说明服务端没有接收到客户端发送的ack=n+1消息,在重试发送FIN消息,此时客户端再次发送ack=n+1再次进入TIME_WAIT状态,直到服务端2MSL时间没有服务后关闭客户端连接)完成第4次握手。
同时挥手:
在这里插入图片描述

四.通过序号与确认应答保证数据传输可靠性
在tcp当中,发送端的数据到达接收主机时,接收主机会返回一个已收到消息的通知。这个消息叫确认应答(ACK),当发送端将数据发送后,会等待接收方的确认应答,如果有确认应答说明接收方已经收到数据。反之则数据丢失的可能性很大。
在一定时间内发送端没有收到确认应答,发送端则认为数据已经丢失,并进行重发。由此,即使发生了丢包,仍能保证数据能够到达接收主机,实现可靠传输。
未收到确认应答并不能说明数据一定丢失了,有可能是数据对方已经接收到,只是返回的确认应答在途中丢失,这种情况也会导致发送端误以为数据没有到达目的地而重发数据。也有可能一些其他原因导致确认应答延迟到达,可能在源主机重发数据以后才到达,这种情况源主机也只要按照机制重发数据即可。
对于目标主机来说,反复收到重复消息是不可取的。为了对上层应用提供可靠传输,目标主机必须放弃重复的数据包,因此我们引入了序列号。
序列号是给数据的每一个字节(8位bit)都标上号码的编号,接收端查询接收tcp首部的序列号和数据长度,将自己下一步应该接受的序列号作为确认应答反送回去。通过序列号与确认应答号,tcp能够识别是否已经接收数据,又能够识别是否需要接收数据,从而实现可靠传输。
在这里插入图片描述
重发超时的确定:
重发超时是指在重发数据之前,等待应答到来的那个时间间隔。如果超过那个时间仍为收到确认应答,发送端将进行数据重发,最理想的是,找到一个最小时间,它能保证“确认应答一定会在这个时间内返回”。
tcp要求无论在哪种环境下都能提供高性能通讯,并且要求无论网络情况发生何种变化,都必须保持这一特性,为此它会在每次发包时都计算往返时间及其偏差,将这个往返时间和偏差时间相加,超时时间就是比这个总和稍大一点的值。
在BSD的Unix和Windows系统中,超时时间都是以0.5秒为单位进行控制,因此重发超时都是0.5秒的整数倍。不过,最初其重发超时时间一般设在6秒左右。
数据被重发后若还是收不到确认应答,则进行再次发送,此时,等待确认的时间会以2倍4倍的指数函数延长。此外,数据不会反复重复的被重发,到达一定次数后,仍没收到任何确认应答,则判断网络或接受主机发生异常,发送端强制关闭连接,并通知应用通信异常强行终止。

以段位单位发送数据:
在建立tcp的连接同时,也可以确定发送数据包的单位,我们也称其为最大消息长度(MSS),最理想的情况是,最大消息长度正好是ip中不会被分片处理的最大数据长度。
tcp在传输大量数据是是以MSS的大小将数据进行分割发送,数据重发是也是以MSS为单位。
MSS在三次握手时被两端主机计算得出,两端连接主机在发出连接建立请求时,会在tcp首部选项写入MSS,告诉对方自己的接口能够适应的MSS大小。然后会在两者之间选择一个较小值投入使用。

五.滑动窗口机制
tcp以段为单位进行传输,每发一个段进行一次确认应答,如果往返时间较长,则通讯的性能就会低。
为了提高tcp传输性能,tc引入窗口这个概念,确认应答不再是以每个分段,而是以更大的单位进行确认,转发时间将会大幅度缩短,也就是说发送端主机在发送一个段后不必一直等待确认应答而继续发送下一个段数据
在这里插入图片描述
窗口大小是指发送端无需等待确认应答而可以继续发送数据的最大值,上图中窗口大小为4段,为实现这个机制使用了大量缓冲区,同时进行确认应答的功能。

在这里插入图片描述
上图中窗口内的数据即便是没有收到确认应答也可以被发送出去,不过在整个窗口的确认应答没到达之前,如果部分数据出现丢包,发送端仍然要负责重传,为此,发送端需要设置缓存保留这些待被重传的数据,直到收到他们的确认应答。当发送端如期收到窗口数据确认应答后就可以不再对这些数据进行重发,此时数据可以从缓冲区中清除。
接收主机在顺序接收到报文段后,定时器定时检查回复确认应答,并将服务端窗口滑动前移,发送主机在接收到确认应答后也会将窗口滑动到确认应答中序列号的位置,这样可以实现多个段同时发送,提高性能。这种机制成为滑动窗口控制。

滑动窗口控制中的重发机制:
    在窗口控制中,出现丢包一般是以下两种情况

1.确认应答未能返回。这种情况数据已经到达,是不需要重发的。
在这里插入图片描述

2.某个报文段丢失。
接收主机如果收到一个自己应该接收的序列号以外的数据时,会针对当前为止接收到的数据进行确认应答,窗口比较大又出现报文丢失的情况,则同一个序列号的确认应答将会被不断重复发送,如果发送主机连续收到同一个确认应答,就会将其对应的数据进行重发,这种机制比之前提到的超时重发机制更高效,因此被称为高效重发机制。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值