宝哥软件园

详细讲解TCP协议_电源节点Java研究所整理

编辑:宝哥软件园 来源:互联网 时间:2021-09-04

本文描述了TCP协议。首先,简要介绍了TCP实现了哪些功能。本文介绍了TCP报文格式和典型报文的数据格式。然后从链路控制和数据传输两个方面进行介绍。在TCP中,链路控制和数据传输是通过同一个信道进行的,控制信道和数据信道没有区别。当数据(控制或真实数据)在网络中传输时,网络可能会拥塞。因此,简要描述了主机采用的拥塞控制方法,并简要提到了中间路由器/交换机为避免拥塞而采取的主动措施。最后,介绍了TCP性能分析的一些基本概念。开发网络应用时,需要对应用的网络需求进行估计。

本文不是TCP的入门资料。在阅读之前,你需要有一些TCP的基础知识,比如三次握手、四次挥手、滑动窗口等等。

TCP概述

一般来说,说到TCP,我们自然会认为它为上层提供了面向连接的、可靠的、端到端的数据流服务,我们通常用电话线来比较一个TCP连接。但是这种类比对于刚接触TCP的人来说,很容易导致误解。我们需要仔细考察这些概念,你会发现TCP并没有那么面向连接,也没有那么可靠,数据仍然是通过消息传输的。实际上,TCP提供了一种“尽力而为”的数据传输模型;同时还提供主机端拥塞控制,防止网络拥塞,试图了解整个网络情况并采取合适的策略(貌似不是TCP应该做的?)。

TCP连接并不意味着数据交换的两端都存在实际或虚拟的链路,而是连接的两端都维护一些资源(如输入输出缓冲区和各种定时器)和链路状态信息,并通过双方的控制消息交互管理状态,为用户提供修改这些资源分配的接口。在“连接控制”部分,我们将仔细检查资源和状态(包括控制状态消息)。如果控制消息丢失,连接将处于不一致的状态。TCP试图通过一些手段(如保活定时器、保持定时器等)来解决这些问题。).

TCP提供可靠的数据传输服务,其措施是确认控制报文和数据报文,超时后重传;采用滑动窗口协议解决数据传输的无序问题,由发送方和接收方共同控制流量。具体来说,对于发送方,TCP按照最合适的长度发送数据报文,发送报文后启动定时器,等待数据的确认报文,定时器到期后如果仍未收到确认报文,则重发报文;对于接收方来说,收到数据后,先检查报文的校验和,然后直接丢弃报文,无需确认(发送方会注意到这一事实并重新发送);重复的消息被接收、丢弃和不被确认;通过双方维护的滑动窗口,TCP在将乱序消息提交给上层应用之前对其进行整理。需要注意的是,流量控制和拥塞控制不是一回事。流量控制的目的是防止发送方发送大量数据,超出接收方的处理能力,造成丢包等。拥塞控制是为了防止网络拥塞,中间路由器或交换机丢弃消息。

TCP提供数据流服务,上层应用将数据传输给TCP。TCP不区分,只是根据自己的需求将数据合并拆分,然后传输到对端。然后,相对的TCP协议栈按照传输顺序将数据提交给上层应用程序。TCP的数据传输仍然是以IP报文的形式发送到对端,每次尽力发送MSS大小的报文,都会在“数据传输”一节看到流中对Nagle算法、TCP_CORK等报文的控制。

TCP本身不提供消息边界之类的东西,但是提供应急数据和PUSH标志(但不提供外部接口)来模拟消息。通常,TCP数据流的划分是应用程序的业务,应用程序定义格式并自行解析。常见方案如下:

首先,发送一个固定大小的消息长度字段;按行拆分(或其他分隔符);固定长度记录;编码方案,如xml、json、ASN.1、tlv等。TCP消息

TCP消息格式

TCP报文最终由IP层发送,封装后的报文如下:

TCP消息格式如下:

通常,四元组用于唯一表示一个TCP连接(客户端-IP、客户端-端口、服务器-IP、服务器-端口),但应注意以下事实:

监控服务器在服务器端口窗口中接受来自客户端的连接,并分叉一个子进程来处理该连接。此时,四重对应服务器中的两个进程(监控进程只处理SYN消息,而子进程只能处理数据消息和FIN等。);连接头像,后面会详细介绍。在TCP报头的图中,我们主要关注以下字段:序列号、报头长度、6个标志位、选项、窗口大小和紧急指针,这些都是以字节为单位的,这里就不关注了。

不带选项的TCP报头是20字节,报头选项指示报头有多少个4字节。因为它占用4位,所以最大报头是60字节。

序列号字段用于识别TCP数据流中的数据字节流。当建立连接时,它将被初始化为一个ISN,以及每个SYN、FIN等。会消耗一个序列号。我们不太关心这个字段,我们只需要知道序列号是32位。在长胖管道(大容量网络)中,序列号可能会绕回,TCP需要识别它。TCP也相应地扩展了这个字段(增加了选项)。

TCP选项由1字节类型、1字节长度(可选)和内容(可选)表示,只能有类型,长度字段本身包含类型和长度。常见的选项如下图所示,通常使用无操作选项作为填充,以满足选项对齐的要求,这些选项通常包含在tcpdump连接建立的输出中:

TCP报头中定义了六个字段。在一条消息中,通常只出现一个标志,但允许多个标志同时出现。

URG,紧急指针标志位。确认,确认序列号的标志位。关于ACK有几点需要注意:a) ACK是累积的,表示接收方已经正确接收到确认序列号减1之前的所有字节;B) TCP通常不确认每个数据包,而是采用捎带确认和延迟确认技术。捎带确认指的是将ack消息合并成数据消息,而延迟确认则意味着TCP保持200 ms的定时器。在定时器到期前,如果需要确认多个数据,会一起确认,通常两个消息确认一次。如果200ms后没有新的数据需要确认,直接确认。c)ACK消息本身不会被确认,当ACK丢失时,需要通过对等超时机制发现(后面会详细介绍)。PSH,该标志由TCP自动设置(曾经允许通过接口设置,但目前大多数实现不提供)。大多数实现在发送方清空发送缓冲区时设置此标志,也就是说,发送方将一次发送当前发送缓冲区中的所有数据。RST,连接到复位标志位。同步标志位SYN用于启动新连接。FIN,发送端已完成所有数据传输,不会发送新数据,因此其发送端关闭。如果对端也发送此标志,连接将完全关闭。公共消息

除了TCP中常见的数据交换消息(详见“数据传输”),还有一些特殊的控制消息如下:SYN消息、ACK消息、FIN消息、RST消息、窗口探测消息和保活消息。这里列出了常见的消息。一是为了强调TCP状态变化大多是通过消息交互进行的;其次,简单总结了各种控制消息的使用场景。

用来发起新连接的SYN消息,只包含TCP头,没有数据。典型的消息输出如下:

10:23:17 . 543837 IP 192 . 168 . 47 . 1 . 55366 krt . 98763360 Flags[S],seq 2289863414,win 8192,options [mss 1460,nop,wscale 2,nop,nop,sackOK],长度0

确认消息,用于确认控制消息(不包括RST)和数据消息。请参考上一节中关于确认的一些注释。该消息可以与其他消息组合,如SYN、数据消息、FIN消息等。单独的ACK本身不包含任何数据,只包含报头,典型的消息输出如下:

10:23:17 . 544135 IP 192 . 168 . 47 . 1 . 55366 krt . 9876: Flags[。】,ack 1,win 16425,长度0

FIN消息,用于通知对端所有数据已发送。在发送缓冲区中发送数据后,可以关闭连接。有关详细信息,请参考下面的“连接控制”,用于按顺序释放连接或半程打开连接。

RST消息,当消息被发送到错误的连接时,它被接收。以下是几种典型情况(详细场景在下面的小节“连接控制”中描述):

对端对应端口没有监听器异常终止连接,SO_LINGER。以非正常方式终止连接,而不是正常有序终止连接有序释放,会强制连接直接丢失未发送的数据;当接收器接收到RST消息时,read返回一个重置错误,从而在没有确认的情况下终止连接。当检测到半开放连接时,一方已经异常关闭或终止连接,而另一方还不知道。出现这种情况的原因是通信的一方未能正确地向另一方发送相应的状态消息。如果由于主机突然断电而没有发送FIN消息,此时再次写入套接字将获得RST消息。窗口探测消息(持久探测消息),TCP不确认无数据的ACK消息,因此ACK可能丢失,导致窗口通告失败。TCP使用持久计时器定期发送一个字节的窗口探测消息。探测消息始终在5~60s内,也采用指数退避算法,但探测消息不会超过60s。使用500毫秒的定时器来实现。

保持活动消息,一种用于检查连接是否仍然活动的控制消息。报文只携带ACK标志,序列号字段为待发送的序列号减1,导致对端做出ACK,表示收到重复的序列号,对端期望的序列号为下一个值。

连接控制

TCP是一种面向连接的协议。如上所述,没有真正的物理或虚拟链接。TCP连接是指通信双方之间的资源分配和状态维护,通过控制消息控制连接,通过API协调资源。本节将详细描述TCP的连接控制。需要注意的是,连接的拥塞控制在本节中涉及不多,这将在后面单独的章节中描述。

四个定时器:重传定时器、2MSL定时器、持续定时器和保持活动定时器

双方通过以下事件维护连接状态:发送方:发送缓冲区、4个定时器、发送窗口、拥塞状态计数器接收方:接收缓冲区、4个定时器、接收窗口、拥塞状态计数器

更详细地描述了TCP连接。双方通过一些内部状态保持彼此的信息,连接关系始终保持,通过消息切换改变连接状态。因为连接状态是通过消息来维护的,所以当消息没有正确发送或接收时,连接状态将变得意外;除了确认消息本身没有确认,其他消息都会有确认消息进行确认;消息(包括确认消息)可能会超时,需要重新传输。以下是沟通过程中一些重要信息的互动顺序。

发送方网络(由中间路由器等组成。)接收器

发送方是Windows,接收方是Linux。操作如下

[电子邮件保护]: ~ $ perl ksock。pl-先睡后听=1个窗口下c : user win-krtDesktoptelnet 192。168 .47 .120 9876[电子邮件受保护]: ~ $ sudo tcpdump-n-I eth0 TCP端口9876 tcpdump:详细输出被抑制,使用-v或-vv进行eth 0上的全协议解码侦听,链接类型为FORMANENT MB(以太网),捕获大小为262144字节【1:59:16】,ack 1,win 16425,长度0 13:59:19 .564526 IP 192。168 .47 .1 .65281 192 .168 .120 .98763:标志[p .seq 1:2,ack 1,win 16425,长度1 133336360936 .【33333:9】,ack 2,win 229,长度0 13:59:19 .565023 IP 192。168 .47 .120 .9876 192 .168 .1 .65281:标志[p .seq 1:13,ack 2,win 229,长度12 1333:6 .3333333:5],ack 13,win 16422,长度0 13:59:19 .764023 IP 192。168 .47 .1 .65281 192 .168 .47 .120 .9876:旗帜[.】,ack 13,win 16422,选项[nop,nop,sack 1 {1:13}],长度0 13:59:23.688209 IP 192。168 .47 .1 .65281 192 .168 .47 .120 .9876:标志[f .],序列2,ack 13,win 16422,长度0 110】,ack 14,win 16422,长度0

连接建立

连接建立过程中会经历被称为"三次握手"的报文交互。

连接建立过程主要目的在于协商双方通信的细节,双方的初始序列号、窗口大小、最大报文段手写本大小等。

连接断开

数据传输

数据交换(基本的确认、超时、重传,滑动窗口)

交互数据和批量数据交换

拥塞控制

性能和常用网络工具

tcpdump lsof netstat ss/prociputils包网络工具包iproute2包

更多资讯
游戏推荐
更多+