干货 | 浅谈TCP/IP协议栈(九)初始TCP协议

admin 2022年4月25日10:05:11评论41 views字数 2720阅读9分4秒阅读模式

干货 | 浅谈TCP/IP协议栈(九)初始TCP协议

干货 | 浅谈TCP/IP协议栈(九)初始TCP协议
特别感谢本期作者:咖啡不加盐


上一节介绍了传输层的UDP协议,这一节开始介绍它的兄弟——TCP协议,通常计算机网络中最常见的一个名词就是TCP/IP协议栈,我们已经介绍过了IP协议,也知道IP协议是整个网络转发的基石,而TCP协议竟然还能排在IP之前,可见其重要性,因此我们会用较多的篇幅来介绍TCP协议。

接触或学习一个协议之前,先弄清楚该协议的作用和特点,可以让我们很快上手,先来看看TCP协议的官方介绍: 

TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP)是同一层内[1] 另一个重要的传输协议。在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。 ——来自百度百科

说实话从百度上copy出这么一大段话,只是为了权威,其中有用的话就一句:TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,今天我们就围绕这句话,开始介绍TCP协议。 

从TCP的描述中可以看到,其有三个特点: 

1、面向连接 

2、可靠的 

3、字节流服务

首先是面向链接,也就是说TCP协议必须建立在一个稳定的连接之上,就好比打电话,一方拨号,一方接通,双方才能进行通讯,相比于UDP的无连接状态,TCP需要保持连接就确保其比UDP稳定一些,相应的开销方面TCP也会比UDP多一部分。 

其次是可靠的服务,之前我们介绍的IP协议还有UDP协议,都是不可靠的协议,即只管发送报文,而不管报文是否能够收到,因此TCP协议也号称“永不丢包的协议”,这就说明了TCP协议是极其可靠的,而其可靠性主要是由以下几点保证的: 

应用数据被分割成TCP认为最适合发送的数据块,这和UDP完全不同,应用程序产生的数据报长度将保持不变,由TCP传递给IP的信息单位称为报文段或段(segment) 。

当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段,如果不能及时收到一个确认,将重发这个报文段。 

当TCP收到发自TCP链接另一端的数据,它将发送一个确认。这个确认不是立即发送。 

TCP将保持它首部和数据的校验和,目的是检测数据在传输工程中的任何变化。如果收到的校验和有差错,TCP将丢弃这个报文段和不确认收到此报文,希望发送端超时并重发。 

既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。如果必要,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。 

IP数据报还会发生重复,因此TCP的接收端必须丢弃重复的数据报文。

所谓的字节流服务是指,两个应用程序通过TCO传输8bit也就是1字节构成的字节流,TCP对字节流的内容不作任何解释,TCP不知道传输的数据字节流是二进制数据还是ASCI字符或者其他数据类型数据,对字节流的解释由TCP连接双方来解释。

介绍完TCP的三个特点,面向连接,可靠和字节流服务以后,是时候讲一讲TCP的首部了,TCP数据被封装在IP层之上,如图所示: 


干货 | 浅谈TCP/IP协议栈(九)初始TCP协议 

TCP首部的具体格式如下: 

干货 | 浅谈TCP/IP协议栈(九)初始TCP协议 

每个TCP段都包含源和目的端的端口号,用于寻找发端和收端应用进程。这个值加上IP首部中的源IP地址和目的IP地址唯一确定一个TCP连接,有时,一个IP地址和一个端口号也称为一个插口(socket)。这个术语出现在最早的TCO规范中,后来它也作为标示伯克利编程接口。插口对可唯一确定互联网络中每个TCP连接的双方。 

序号用来标示从TCP发端向TCP收端发送的数据字节流,它表示在这个报文段中的第一个数据字节。如果将字节流看作两个应用程序之间的单向流动,则TCP用序号对每个字节进行计数。序号是32bit的无符号数,序号达到最大值以后,会从0开始。 

当建立一个新的连接时,SYN标志变为1。序号字段包含由这个主机选择的该连接的初始序号ISN。该主机要发送数据的第一个字节序号为这个ISN加1,因为SYN标志消耗了一个序号。 

既然每个传输的字节都被技术,确认序号包含发送确认的一端所期望收到的下一个序号。因此,确认序号应当是上次已成功收到的数据字节序号加1。只有ACK标志位1时,确认序号才有效。 

发送ACK无需任何代价,因为32bit的确认序号字段和ACK标志一样,总是TCP首部的一部分。因此我们看到一旦一个连接建立起来,这个字段总是被设置,ACK标志也总是被设置为1。

TCP位应用层提供全双工服务。这以为数据能在两个方向上独立的进行传输。因此连接的每一端都必须保持每个方向上的传输数据序号。 

TCP可以表述为一个没有选择确认或否认的滑动窗口协议(滑动窗口协议用于数据传输)。 

我们说TCP缺少选择确认是因为TCP首部中的确认序号表示发送方已经成功收到字节,但还不包含确认序号所指的字节。 

首部长度给出首部中32bit的数目,需要这个值是因为任选字段长度是可变的。这个字段占4bit,因此TCP最多有60字节的首部。然而,没有任选字段,正常的长度是20字节。 

在TCP首部中有6个标志比特,它们中的多个可同时被设置为1。这些标记位是TCP协议传输很重要的一部分,各个标记位的含义: 

URG:紧急指针 

ACK:确认序号有效 

PSH:接收方应该尽快讲这个报文段交给应用层 

RST:重新连接 

SYN:同步序号用来发起一个连接 

FIN:发送端完成发送任务标记位 

至于这些标记会在何时置位,在TCP传输中起到什么样的作用?以后有机会再继续讲解。

关于后面的紧急指针,则是在URG置位时才会用到,一般传输时很少用到。 

好了,关于TCP协议的简介就到此为止,大家只要能理解TCP协议的特点,知道TCP报文首部长啥样就行。


往期回顾


 本文来源:咖啡不加盐的CSDN博客 

干货 | 浅谈TCP/IP协议栈(九)初始TCP协议


《浅谈TCP/IP协议栈》系列干货就为大家分享到此。

应广大学员要求,下期将为大家分享《分布式文件系统》相关的技术干货,敬请期待~~~

干货 | 浅谈TCP/IP协议栈(九)初始TCP协议

干货 | 浅谈TCP/IP协议栈(九)初始TCP协议

原文始发于微信公众号(e安在线):干货 | 浅谈TCP/IP协议栈(九)初始TCP协议

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年4月25日10:05:11
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   干货 | 浅谈TCP/IP协议栈(九)初始TCP协议http://cn-sec.com/archives/696318.html

发表评论

匿名网友 填写信息