TCP协议基础

一.TCP协议简介

在传输层协议中,UDP只为应用程序提供了一种无连接的、不可靠传输服务。而在很多情况下,应用程序期望传输层能提供可靠的服务,在上层应用想把大量的顺序数据(例如一个文件)发送到另一台主机时,使用UDP会显得非常不方便。在对可靠性要求很高的场合下,使用TCP提供的传输性能是很合适的,TCP将两个进程间传递的数据看作数据流的形式,两个先后发出的TCP报文虽然在网络中也是互不相关的传输,但是它们携带的数据之间却具有关联关系,因为TCP给传输的每个字节数据一个唯一的编号。在接收端,所有数据将按照编号被顺序组织起来,当所有数据接收成功后,TCP才把数据递交给应用层。应用层不必担心报文的乱序、重复、丢失等问题,TCP采用正面确认以及超时重传等机制保证数据流能全部正确到达

二.TCP的特性

TCP同UDP在某些地方也具有相似性,它们都使用端口号来标识一个应用程序,采用客户机一服务器的模型来实现两个进程之间的通信。除此之外,TCP还具有很多特殊特性,也正是这些特性,使TCP能为应用程序提供可靠性保证。TCP是一个很复杂的机制,它规定了两台主机间传送的报文的格式,以及为保证报文能正确到达目的地而采取的一系列措施,同时也包括了必要的差错与控制机制

1、完整的连接机制:TCP中,协议为通信的双方提供了完善的连接建立机制和连接断开机制,一个TCP连接必须完整地记录通信双方的IP地址和端口号

2、正面的确认与重传:为了确保数据报交付的有效性,TCP通信双方必须进行交互,以通告数据接收结果。在接收方,每收到一个报文后,它都会向发送方返回一个确认,而发送方在发送完一个报文后,必须等待对应的确认返回;同时,发送方为每个报文启动一个定时器,如果在指定的时间内没有收到确认,发送方会认为报文发送失败,并重传报文。通常TCP中的正面确认通过捎带的方式来实现,即接收方把确认信息放到反向传送的数据报文中,不必单独为确认信息申请一个反向报文,捎带机制减少了网络中的通信流量

3、缓冲机制:在发送方,上层应用程序可能会将各种大小各异的数据流交给TCP发送,TCP提供了完整的缓冲机制来提高传送效率并减少网络中的通信量,在少量数据发送时,协议通常会短暂延迟数据的发送时间,以缓冲到更多的用户数据,组成一个最佳大小的报文段发送出去;对于每个发送出去的报文,TCP不会马上删除它们,而是将它们保存在内部缓冲中,以便需要的时候重传,只有等到对应的确认到达后,报文才会在缓冲区中被删除;同理,接收方也必须维护良好的缓冲机制,因为底层的报文可能是无序到达的,这里需要把各个无序报文组织为有序数据流,重复的报文会被删除

4、全双工通信:一旦两个应用程序之间建立起了连接关系,那么它们之间就是对等的,任何一方都可以向另一方发送数据

5、流量控制:TCP中引进了滑动窗口的概念来进行流量的控制,接收数据的一方可以向发送方通告自己接收窗口的大小,告诉发送方自己的接收能力,而发送方可以根据这个窗口的大小来发送尽可能多的数据,同时又保证了接收方能够处理这些数据

6、差错控制:正面确认和重传都属于差错控制,此外TCP和其他协议一样,也采用校验和的方式来验证数据的有效性;同时,TCP的缓冲机制会对接收的数据进行检查,对重复的报文进行丢弃,对失序的报文段进行重组,对丢失的报文通知发送方进行重传。TCP最终递交给应用程序的数据应该是顺序的、无传输差错的完整数据

7、拥塞控制:拥塞控制考虑的是网络的传输状况。通常在路由器发送拥塞时,它会丢弃掉不能处理的数据报,这将导致发送方因接收不到确认而重传,重传的数据同样不会成功,且重传会使得路由器中拥塞更为严重。拥塞发生时报文被丢弃,但是发送方不会得到任何报文丢失的信息,因此,发送方必须实现一种自适应机制,及时检测网络中的拥塞状况,自动调节数据的发送速度,这样才能提高数据发送的成功率。在TCP中引进了一个名为“拥塞窗口”的概念,与滑动窗口相似,拥塞窗口也是发送方控制数据发送速度的方式之一

8、其他有效机制:糊涂窗口现象与糊涂窗口的避免、零窗口探测机制、连接保活机制等

三.TCP的连接

TCP通信常基于客户机一服务器模型,而一个服务器程序可以使用同一个本地端口与多个客户机进行通信,在这样的情况下,服务器程序和每个客户机之间都存在一个连接,各个客户机发送到服务器上的数据报虽然都有相同的目的地址和目的端口号,但是它们却不会相互影响,因为它们属于不同的连接。在TCP中引入了端点的概念,端点标识为(IP地址,端口号),有了端点,那么就可以这样来定义一条TCP连接:一条连接包含两个有效的端点,例如连接1(192.168.1.37,80)和(192.168.1.1,7675)和连接2(192.168.1.37,80)和(192.168.1.37,9546)就表示了两个连接。服务器常用的熟知端口如下:

四.TCP的数据流编号

在IP协议中,会对每个数据报进行编号,而在TCP中没有报文编号的概念,因为它的目标是数据流传输,数据流由连续的字节流组成,尽管在上层可能用各种各样的数据结构和格式来描述数据,但在TCP看来,数据都是字节流。TCP把一个连接中的所有数据字节都进行了编号,当然两个方向上的编号是彼此独立的,编号的初始值由发送数据的一方随机选取,编号取值是0~2^32-1,比如发送方选择的起始编号为20,且将要发送的数据长度为800字节,那么字节编号将覆盖20到819的范围。当所有字节被编上号后,字节流会被分装在若干个TCP报文中发送,此时TCP报文首部的字段能够记录它所运载数据的起始编号以及运载数据的长度。在接收端,可以根据这些信息对报文中数据进行排序和确认。例如,将上述的800字节放在三个报文段中来发送,前两个报文段各装载了300字节的数据,最后一个报文装载了200字节的数据,则三个报文段携带的数据情况如下:

报文段1:起始序号:20,数据长度:300,序号范围:20~319
报文段2:起始序号:320,数据长度:300,序号范围:320~619
报文段3:起始序号:620,数据长度:200,序号范围:620~819

接收方通过确认的机制来告诉发送方数据的接收状况,这是通过向发送方返回一个确认号来完成的,确认号标识出自己期望接收到的下一个字节的编号,例如在上面的例子中,如果接收方接收到了报文段1,则它返回给发送方的确认号为320,表示自己期望收到数据编号为320的数据;确认号是累计的,即如果发送方接收到确认号的值为620,说明接收方已经正确接收了620编号以前的所有数据,接收方可能是在收到两个报文段后才发送的一个确认;还有一种情况,如果接收方只收到报文段1和3,那么它返回的确认号仍然是320,确认号始终表示接收方期望的下一字节数据,尽管可能已有更高编号的数据被收到

五.TCP的滑动窗口

在数据发送端,所有数据流按照顺序被组织在发送缓存中,什么时候发送数据以及发送的多少是由滑动窗口决定的,使用窗口滑动的概念可以达到很好的流量控制效果和拥塞控制效果。如下图所示,滑动窗口可以看成定义在数据缓冲上的一个窗口,缓冲中存放了从应用程序传递过来的待发送数据,窗口能在缓冲上滑动,滑动窗口状态决定了TCP能发送哪些数据。滑动窗口较大时,  TCP可以在收到确认之前一次性地发送几个报文段,这样,可以使得网络总是处于忙碌状态,提高网络的吞吐率。当发送窗口较小时,能够被发送的报文很少,在极端情况下,当发送窗口为0时,没有任何报文能被发送,减少报文的发送是进行拥塞控制的最直接手段。因此,流量控制和拥塞控制的本质在于对发送窗口的合理调节

如上图中所示,发送方在发送缓冲上维护了一个发送窗口,窗口将整个缓冲区数据分为三部分,窗口左边的数据表示已成功发送且已被接收端确认的数据,窗口右边表示不能被发送的数据,窗口内部表示可以发送的数据。如图所示,窗口内的数据又可以分为两部分,第一是编号5~10的已发送但是未被接收方确认的数据,第二是编号为11~13的可发送但未发送的数据(这些数据可能是因为不能组成一个合适长度的报文,因此未被发送)。若此时发送方接收到值为6的确认号,则窗口会向右滑动,5和6被排除在窗口之外,而14~15将被包括在窗口内,成为可发送的数据。另一方面,接收方为了接收数据,也必须在接收缓存上维护一个接收窗口,接收方需要将数据填入缓冲区,对数据进行顺序组织等操作,并向发送方通告自己的接收窗口大小,它告诉发送方:我还能接收多少字节的数据。发送方应该根据这个窗口通告值适当地调整发送窗口的大小,以调整数据的发送速度

六.TCP报文格式

TCP协议有着自己的数据包格式,这里把TCP的数据包称为报文段(segment),TCP报文段封装在IP数据报中发送,TCP报文段由TCP首部和TCP数据区组成,首部区域包含了连接建立与断开、数据确认、窗口大小通告、数据发送相关的所有标志和控制信息

首部的大小为20~60字节,在没有任何选项的情况下,首部大小为20字节,与不含选项字段的IP报首部大小相同。TCP报文中的数据部分可以为空,例如在一个连接建立或断开时,双方交换的报文段仅有TCP首部;又如当一方没有任何数据需要发送,则它需要使用不包含任何数据的报文段来发送确认信息。

1、与UDP报文相同,源端口号和目的端口号两个字段用于标识发送端和接收端应用进程分别绑定的端口号。这两个值加上IP数据报首部中的源IP地址和目的IP地址就能唯一确定一个TCP连接

2、32位序号字段标识了从TCP发送端到TCP接收端的数据字节编号,它的值为当前报文段中第一个数据的字节序号。在接收方,先计算出数据区数据的长度,然后使用首部中的序号字段,就能计算出报文最后一个字节数据的序号。当建立一个新连接时,握手报文首部中的SYN标志置1,此时,序号字段包含由发送方随机选择的初始序号ISN(Initial Sequence Number)。
建立连接的报文(SYN)将占用一个数据编号,因此发送方随后将要发送数据的第一个字节序号为ISN+1

3、32位确认序号只有ACK标志为1时才有效,它包含了本机所期望收到的下一个数据序号,确认常常和反向数据一起捎带发送

4、4位首部长度指出了TCP首部的长度,以4字节为单位。需要这个值是因为选项字段的长度是可变的。由于这个字段有4bit,因此TCP最多有60字节的首部,如果没有任何选项字段,首部长度应该为5(20字节)

5、在TCP首部中有6个标志bit,它们中的多个可同时被设置为1,它们告诉了接收端应该如何解释报文的内容,比如一些报文段携带了确认信息、一些报文段携带了紧急数据、一些报文包含建立或关闭连接的请求。6个标志位的意义如下图:

6、窗口大小字段可看作捎带的另一个例子,窗口通告可以附加在任何报文段中发送。在TCP发送一个报文时,可在窗口字段中填写相应值以通知对方自己的可用缓冲区大小(以字节为单位),报文接收方需要根据这个值来调整发送窗口的大小。这个字段是16bit的,所以通告窗口的最大值为65535字节。窗口字段是实现流量控制的关键字段,当接收方向发送方通知一个大小为0的窗口时,将完全阻止发送方的数据发送

7、16位校验和字段的计算UDP校验与计算过程和原理都相同,在UDP首部中,校验和的计算是可选的,但在TCP中,校验和的计算是必须的、强制的。TCP中校验和包含了IP伪首部、TCP首部和TCP数据区三部分。伪首部的概念与UDP中的完全一样,只是伪首部中的协议字段值为6,与TCP相对应

8、16位的紧急指针只有当紧急标志位URG置位时才有效,此时报文中包含了紧急数据,紧急数据始终放在报文段数据开始的地方,而紧急指针定义出了紧急数据在数据区中的结束处,用这个值加上序号字段值就得到了最后一个紧急数据的序号

七.TCP选项

TCP首部可包含0个或多个选项信息,选项总长度可达40字节,用来把附加信息传递给对方。每条TCP选项由三部分组成:1字节的选项类型+1字节的选项总长度+选项数据。如下图

1、最大报文段长度(MSS),每个连接方通常都在通信的第一个报文段(包含SYN标志的连接握手报文)中指明这个选项,用于向对方指明自己所能接受的最大报文段。每一方都不应该发送超过对方指定MSS大小的报文段,由于选项中最大报文段长度是16位的,所以MSS的值在0到65535之间,如果一方没有向另一方指明自己的MSS,则表明它将使用默认最大报文段长度536

2、窗口扩大因子选项可以让通信的双方声明更大的窗口,首部中的窗口字段用于通告本端的接收窗口大小,其长度为16bit,最大值为65535字节,在许多高速场合下,这样的窗口还是太小,会影响发送端的发送速度。使用窗口扩大因子,可以向对方通告更大的窗口,此时通告窗口大小值应该通过下面的方式来计算,其中A为窗口扩大因子的值:通告的窗口大小=首部中窗口大小字段值×2^A,注意,窗口扩大因子选项也只能在连接建立时使用,在连接建立后的数据传输阶段,窗口因子将一直保持有效,通告窗口大小始终使用上面的式子计算得出

3、最后,一个报文段中的选项信息总长度必须是4字节的整数倍,如不是,需要在选项信息后面补0,直至长度满足要求

八.TCP的强迫数据交互

TCP采用了缓冲机制来保证协议的高效性,在数据发送时,TCP内核将延迟小分组数据的交付,它将等待足够长的时间,以期待接收更多的应用数据,最后再一起发送;在接收数据时,TCP首先是先将数据放在接收缓冲中,只有在应用程序准备就绪或者TCP协议认为时机恰当的时候,数据才会被交付给应用程序。上述缓冲机制是出于对网络性能提升的考虑,但是它可能会妨碍某些应用程序的使用。例如,两个应用程序进行交互式通信,一端应用程序打算把用户键入的字符发送给另一端应用程序,并且期望对方立即响应。在这种情况下,TCP的数据收集与延迟发送、缓冲递交会给用户带来很不好的体验。为了满足交互式应用场合的需求,TCP可以采用下面的方式解决这个问题。发送方应用程序向TCP传递数据时,请求推送(push)操作,这时,TCP协议不会等待发送缓冲区被填满,而是直接将报文发送出去。同时,被推送出去的报文首部中推送位(PSH)将被置1,接收端在收到这类报文时,会尽快将数据递交给应用程序,而不必缓冲更多的数据再递交

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值