[网络]——传输控制协议TCP你必须知道的事

TCP协议

关于TCP协议的介绍的相关书籍已经太多太多,而且在搜索引擎中输入TCP关键字,也会有数以千计的结构展现你面前。但是笔者觉得没有经历过自己整理的东西永远都是别人的,虽然我们整理时可能只是把别人非常完善东西搬过来罢了,但是你要记住一句话:我们要站在巨人的肩膀上眺望远方。写这篇博客目的是让自己加深对TCP协议的理解,也便于自己日后再复习。

TCP主要特点

TCP协议全称传输控制协议,是传输层中设计非常复杂的一个协议,这里介绍以下TCP的主要特点,然后我们后面的详细介绍就以这些特点展开:

在这里插入图片描述

详解TCP报头

ps:图片来源于谢希仁老师的《计算机网络第五版》
在这里插入图片描述

  • 源端口和目的端口:各占两个字节,分别写入源端口和目的端口,目的是为了精确的交付给某个进程
  • 序号:占4个字节。序号的范围是0~2^32,也就意味着有4294967296个序号,当序号比这个数字大之后就又要回到零开始编号。因为TCP传输的每一个字节都需要按顺序编号,所以此字段值是指本报文段所发送数据的第一个字节的序号。
  • 确认号:因为TCP协议中设有确认应答的机制,所以当我们对发送端的数据进行确定时就要填充此字段,此字段的值是期望下一次发送端发送数据第一个数据字节的序号。发送端如果收到了接收端的应答,也就意味着接收端已经收到了确认序列-1之前的数据全部都收到了。
  • 数据偏移:有的书中也会把此字段称为头部长度,实际上他们是没有区别的,我们从图中发现TCP报头固定字段的长度为20字节,而此字段只占4位,也就是最大能表示的数字是15 < 20。事实上此字段的单位是4字节,从这儿看出TCP报头最长为60字节。
  • 保留:当前没有使用,但是不代表以后不使用
  • URG:当URG=1时,表示紧急指针字段有效,与后面的紧急指针是配合在一起使用的。
  • ACK:仅当此字段为1时确认号字段才有效,TCP规定,在建立连接后的所有传送的报文段此字段都必须置为1
  • PSH:我们知道TCP是有接收缓冲区的,这也就意味着数据将被先送往缓冲区,如果报文中设置了PSH字段,那么就表示接收方需要尽快的取走缓冲区中的数据,并不用等到缓冲区满时才取走。当俩个应用进程在通信时,一端进程在键入命令后希望对方理解收到命令,此时就会设置PSH字段
  • RST:RST复位标识,当RST为一时,表明TCP连接中出现了严重的差错,可能由于主机奔溃或者其他原因,必须释放连接,然后再重新建立连接。RST置为1时还用来拒绝一个非法报文段或者拒绝打开一个连接。
  • SYN:同步SYN全称SYNchronization,当SYN等于1而ACK等于0时,表示这是一个连接请求报文段。对方如果已经同意建立连接,那么将返回SYN=1 ACK=1的报文
  • FIN:这个字段全称为FINis,意思是完或者终的意思,用来释放一个连接。当一端向另一端发送FIN=1的报文时表示发送方的数据已经发送完毕,要求释放运输连接。
  • 窗口大小:这个字段将被填充本主机接收缓冲区剩余空间的大小,是为了流量控制而设置的字段,此字段我们在后面详细讲解。
  • 检验和:占两个字节,检验和检验TCP数据报报头和数据的所有数据,与UDP的检验方式相同。
  • 紧急指针:占俩个字节,需要与URG字段配合使用,当且仅当URG=1时此字段才有意义,他指出本数据报中紧急数据的字节数,紧急数据之后就是普通数据。同样他指出了紧急数据所在的位置,当紧急数据处理完时,TCP就告诉程序恢复到正常的操作。为什么需要紧急数据:已经发送了一个很长的程序要在远地主机上运行,但是突然发现了一些问题,所以当你发送终止命令时你的终止数据处于缓存末尾,如果没有紧急数据,那么只有处理了之前的程序数据才会处理紧急数据,就浪费了很多的时间。
  • 选项:这个字段中的选项会在与服务器商量好,所以这个字段中的选项并不是固定的,我们这里先介绍比较常用的几种,等到具体的场景时我们在为大家详细介绍。下面的字段都是选项中的字段
  • 最大报文长度(MSS):TCP最初只规定了一种选项,也就是这里我们所讲的最大报文长度,MSS全称Maximum Segment Size,注意这里的名词,他指的是每个TCP报文中数据字段的最大长度,所以MSS是数据报总长度减去报头长度。那么我们为什么需要有MSS呢?这里其实并不是考虑接收缓存中放不下TCP报文中的数据,MSS与接收窗口值没有任何关系,他的出现主要是为了限制ip数据报的大小,因为如果MSS太小,那么对网络的利用率就会大大降低。而如果MSS太长,到达ip层时又需要进行数据分片,当到达对端如果发生了数据报丢失,结果导致整个数据都需要重传。所以MSS从某种程度上解决了效率问题,不过值得说明的是MSS非常的难设置,因为每一条路径的情况不同,所以一般MSS设置为536~1460之间。
  • 选择确认SACK:协商了此字段的客户端和服务器之间如果发生了一批数据报中间的某个数据报丢失,不需要重传丢失后的所有数据报,只需要重传丢失的那个即可,我们后面还会更细致的讲解。
  • 窗口扩大选项:我们上面说过窗口大小是我们接收缓存区的大小,占16位,上限为64k。选项中有一个窗口扩大选项占3个字节,其中一个字节表示窗口移位值S,最多可以将窗口扩大14位,也就是说我们的接收缓存最大能扩大为2^30个字节。
  • 时间戳和时间戳回送:这俩个选项共占10个字节,时间戳是发送方发送时填入字段的时间,时间戳回送是接收端确认该报文时将时间戳复制到回送时间戳,当发送方拿到这俩个选项就可以计算出RTT(往返时间),RTT具体的应用我们也会在后面讲解。

我们这里介绍了TCP的报头,没错,让人感觉到枯燥无味,但是这却是TCP各种复杂机制实现的基础,对于TCP的报头信息读者们一定要做到烂熟于心,最好能自己画出来,因为当你看到某一个选项时,你就会想起TCP的某个机制。

TCP如何实现可靠传输

1.停止等待协议和超时重传协议

我们这里将停止等待协议和超时重传协议放在一起介绍,因为他们本身都是非常简单的机制,并且放在一起我们通过不同的场景能让大家更好的理解,这里我们要清楚的是停止等待协议其实是一种确认应该的机制:就是说,发送端发送一个数据后就停止发送进行等待,直到收到接收端的确认才发送下一个数据,如下图。虽然TCP协议是全双工的,但是这里我们只讨论单个方向上的数据传输,这样能帮助我们加快理解且不那么复杂:

下图是未出现差错的情况下两台主机进行数据传输的场景,纵轴是时间线,可以看出只要在收到上一个数据的应答发送方才会发送下一个数据,这就是我们所说的确认应答机制。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值