TCP协议特性--可靠

   我们之前简单的讲解了一下TCP的工作方式以及TCP和UDP之间的区别,今天我们再深入的讲一下TCP。

  

TCP是传输层的协议,在到达这一层的时候TCP会给数据加上一个TCP的首部,TCP首部大小最小为20字节,最长是60字节。并且在TCP首部中没有表示包长度的数据或者数据长度的字段,一般来说都是在IP层获知TCP的包长,然后由TCP包长来计算出当前传输的数据长度。

  最开始16位是源端口号也就是发送数据的一方的端口号,之后的16位是目的端口,也就是接受数据的一方的端口号是多少。

  序列号也就是序号理解起来就是我们在TCP发送数据的时候的编号,因为TCP有一个特点就是发送数据是面向数据流的,他会对数据进行分割。所以这里的序号就是给我们的数据包进行分包的,发送数据的时候的序列号并不想我们平时那样从0或者1开始而是在建立链接的时候会随机生成一个,然后通过SYN包传送给接受端主机,并且在进行建立链接或者断开连接的时候也是会在数值的基础上加1 的。确认应答号既可以告诉发送端应该发哪个数据,也表示他之前的数据都正确接受到了,也就是假如我们发送了七个包,然后接收端在确认应答号的位置给了我们一个5代表,1-4都正确收到了,5可能是丢失了,需要我们重新发送一下。

  因为我们之前说了,TCP包的长度最小20最大为60,这就代表着TCP包的长度是不确定的,所以就有了数据偏移,就是告诉我们现在TCP首部是多大,从哪开始是我们的TCP的数据。

  之后是保留部分,也就是现在还没有用途是为了以后扩展使用的,一般来说都设置为0

  对于控制位

  

CWR和ECE变成1的时候是告诉对方这边的网络有拥塞,URG为1时代表着这个数据包中有着紧急数据需要处理,ACK为1代表确认应答的部分数据有效,PSH为1时代表着把收到的数据马上传输给上一层,当为0时会进行缓存,RST代表着当前TCP中存在着异常, 必须马上断开,SYN用于建立链接SYN为1代表想要建立链接,并且在序列号阶段进行序列号的设置。FIN为1代表之后不再有数据进行发送,希望断开连接。

  窗口大小占用的位置为16位用来告诉从确认应答号开始的位置能够接受的数据大小,TCP不允许发送数据超过这个大小,但是当这里的大小为0的时候,发送端可以发送窗口探测来了解最新的窗口大小。

  之后是校验和。和UDP一样,在计算校验和的时候使用了TCP的伪首部,因为在传输过程中可能某个路由器发生了故障,数据就有可能被破坏,这样校验和就可以起到作用,来计算,数据是不是被破坏了。

  紧急指针就是我们上边说到的URG为1的时候有效,这里的数值表示的是紧急数据的指针,也就是从数据部分的首位到紧急指针所指示的位置为止为紧急数据。

  选项中是一些为了提高TCP传输性能的一些选项。

  我们在介绍TCP和UDP的时候进场会说TCP相比于UDP是可靠的,这里IDE可靠到底可靠在哪里呢?

  先说说TCP的确认应答机制,我们在打电话的时候通常也会这样,假如你不停的在和对方说话,但是对方一直没有反应,这时候你已经不能保证对方是不是在听你说话了,并且是不是可能信号断了呢?这时候就需要再两个人进行交流的时候,就需要给一定的回答,TCP的应答机制也是这样,当我知道你说了啥的时候就说一个嗯,当我不知道你说啥都饿时候就返回一个疑问咦?这样对方就知道了,你是收到了,还是没收到,还是收到了不正确的。

当主机A和B发送消息的时候,A发送完之后B就会返回一个确认应答,也就是修改我们上边说的确认应答号。如果在一定时间里边,没有收到B的确认应答就认为可能是发送的数据包丢了,这时候既需要进行重新发送,所以这里的可靠传输,并不是说我能保证你不丢,我能保证的是即使这次数据丢了我还能保证你最后能收到,我会继续给你补发。这就和我们在淘宝买东西一样,淘宝是可靠的,并不能说保证我发给你的货你一定能收到,一定能收到是好的,即使你没收到,或者你收到了不好的货,我会给你退换或者重发,那这家店就是我们说的可靠的。

  但是没有收到确认应答也并不代表着我们的数据包丢了,你想我发送数据都可能丢了,你一个应答包我当然也可能会丢了,这时候发送方并不知道那边有没有收到,他没有收到确认应答就认为你没收到,一段时间之后会再次进行发送,这时候接收端接收到数据之后会再次将返回确认应答, 但是这段数据接收端已经拥有了,这时候会把收到的数据丢到。

  这种凡是对于发送端来说,我无非就是多操作了几下发送,但是对于网络资源来说是浪费的,并且接收端会不断的接受很多重复的数据,这时候就需要引入一个新的机制。

  这就是重发超时,重发超时就是说,在重新发送数据之前,等待确认应答到来的那个特定时间间隔,如果超过了这个时间仍然没有收到我们的确认应答,这时候再进行数据重发,但是这个时间间隔应该设置多少呢?设置太短还是会有很多重复的数据进行发送,设置太长如果数据包真的丢失了需要好久才能再次收到。并且这种时间会随着网络环境来变化的,如果说当前网络十分拥堵时间就要变长,TCP要求的是无论在什么网络环境下都要提供高性能的通信。所以他每次发包的时候都会计算往返的时间以及偏差,就把这个往返时间和偏差相加成为我们的重发超时间,一般来说第一个数据包还不知道往返时间会设置为6秒左右,如果说数据重发了,但是还是没有收到确认应答, 这时候会再次进行发送,但是这时候的确认应答时间会以2倍,4倍的指数函数延长。并且数据也是不会无限的发送的,假如说现在重发达到了一定次数之后,如果仍然没有确认应答,就判断是不是网络或者主机端发生了异常,然后强制断开TCP连接。

  

   这是TCP协议链接里边可靠。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值