返回 登录
0

浅谈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首部的具体格式如下:
图片描述
每个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传输中起到什么样的作用,我们在讲解TCP传输时会具体讲到。
至于后面的紧急指针,则是在URG置位时才会用到,一般传输时很少用到。
可选字段中最常见的就是报文最大长度,这个后续我们也会讲到。

好了,关于TCP协议的简介就到此为止,大家只要能理解TCP协议的特点,知道TCP报文首部长啥样就行,下一节为大家带来,TCP连接的建立和数据传输,也就是三次握手,四次挥手,敬请期待!

评论