《个人TCP协议学习总结》由会员分享,可在线阅读,更多相关《个人TCP协议学习总结(20页珍藏版)》请在金锄头文库上搜索。
1、TCP 协议简介传输控制协议(TRANSMISSION CONTROL PROTOCOL)。TCP 是一个 基于连接的、端到端的可靠协议,该协议设计以用来适应一个支持多个网络应用 程序的层间协议结构。 TCP 提供了在属于不同的但是是互联的计算机通信网络 的宿主主机中的进程对间的可靠进程间通讯。在 TCP 层之下,很少考虑到通信 协议的可靠性。 TCP 假定它可以从底层协议获得一个简单的、潜在的不可靠数 据报。原理上,TCP必须能够在一个从有线连接到包交换或者回路交换网络的 比较大范围的通讯系统上工作。1.1 TCP 报文格式TCP提供一种面向连接的、可靠的字节流服务。图 1 TCP 报文头格
2、式源端口号(16 位),标识主机上发起传送的应用程序;目的端口(16 位) 标识主机上传送要到达的应用程序。源端和目的端的端口号,用于寻找发端和收 端应用进程。这两个值加上I P首部中的源端I P地址和目的端I P地址唯一确 定一个T C P连接。一个I P地址和一个端口号有时也称为一个插口( s o c k e t),插口对(s o c k e t p a i r)(包含客户I P地址、客户端口号、服务器I P 地址和服务器端口号的四元组)可唯一确定互联网络中每个TC P连接的双方。 IP+TCP端口唯一确定一个TCP连接。TCP协议通过使用端口来标识源端和目标端的应用进程。端口号可以使用
3、0到65535之间的任何数字。在收到服务请求时,操作系统动态地为客户端的应 用程序分配端口号。在服务器端,每种服务在众所周知的端口( Well-Know Port) 为用户提供服务。1.1.1 顺序号字段占32比特。用来标识从TCP源端向TCP目标端发送的数据字节流,它表 示在这个报文段中的第一个数据字节。1.1.2 确认号字段占32比特。只有ACK标志为1时,确认号字段才有效。它包含目标端所期 望收到源端的下一个数据字节。1.1.3 头部长度字段占 4 比特。给出头部占 32 比特的数目。没有任何选项字段的 TCP 头部长度 为20字节;最多可以有60字节的TCP头部。1.1.4 预留字段由
4、跟在数据偏移字段后的 6 位构成,预留位通常为 0.1.1.5 标志位字段(U、A、P、R、S、F):占6比特。各比特的含义如下: URG :紧急指针(urge nt poi nter)有效。它使一端可以告诉另一端有些具有某种方式的“紧急数据”已经放置在普通的数据流中。另一端被通知这个紧急数据已被放置在普通数据流中,由接收方决定如何处理。U R G比特被置1,并且一个1 6 b i t的紧急指针被置为一个正的偏移量,该偏移量必须与T C P 首部中的序号字段相加,以便得出紧急数据的最后一个字节的序号。Telnet 和 Rlogin 从服务器到客户使用紧急方式是因为在这个方向上的数据流很可能要
5、被客户的T C P停止(也即,它通告了一个大小为0的窗口)。但是如果服务器进程进入 了紧急方式,尽管它不能够发送任何数据,服务器TCP也会立即发送紧急指针和URG 标志。当客户T C P接收到这个通知时就会通知客户进程,于是客户可以从服务器读取其 输入、打开窗口并使数据流动。ACK:确认序号有效。与确认序号一起使用。 PSH:接收方应该尽快将这个报文段交给应用层。在最初的TCP规范中,一般假定编程接口允许发送进程告诉它的TCP何时设 置PUSH标志。例如,在一个交互程序中,当客户发送一个命令给服务器时,它设聲U SH标志并停下来等待服务器的响应。通过允许客户应用程序通知其TCP设置PUSH 标
6、志,客户进程通知T C P在向服务器发送一个报文段时不要因等待额外数据而使已提交 数据在缓存中滞留。类似地,当服务器的TCP接收到一个设置了PUSH标志的报文段 时,它需要立即将这些数据递交给服务器进程而不能等待判断是否还会有额外的数据到达。 RST:异常终止一个连接。RST也可以断开连接。(a)处理到不存在的端口的连接请求注意:需要注意复位报文段中的序号字段和确认序号字段。因为A C K比特在到达的 报文段中没有被设置为1,复位报文段中的序号被置为0,确认序号被置为进入的I S N加 上数据字节数。尽管在到达的报文段中没有真正的数据,但S Y N比特从逻辑上占用了 1 字节的序号空间;因此,
7、在这个例子中复位报文段中确认序号被置为I S N与数据长度(0 )、 S丫N比特所占的1的总和。Wireshark报文的解析结果可能和报文的内容不对应,以看报文的内容为准。( 2)终止一个异常连接 异常终止一个连接对应用程序来说有两个优点:(1)丢弃任何待发数据并立即发送复 位报文段;( 2) R S T 的接收方会区分另一端执行的是异常关闭还是正常关闭。应用程序 使用的A P I必须提供产生异常关闭而不是正常关闭的手段。终止一个连接的正常方式是一方发送F I N。有时这也称为有序释放;orderly release ), 因为在所有排队数据都已发送之后才发送F I N,正常情况下没有任何数据
8、丢失。但也有可 能发送一个复位报文段而不是F I N来中途释放一个连接。有时称这为异常释放。( 3)检测半打开连接如果一方已经关闭或异常终止连接而另一方却还不知道,我们将这样的T C P连接称 为半打开(Half-Open )的(区别半连接)。任何一端的主机异常都可能导致发生这种情况。 只要不打算在半打开连接上传输数据,仍处于连接状态的一方就不会检测另一方已经出现异 常。对于半打开连接,TCP的处理原则是接收方以复位作为应答。 SYN:发起一个连接。占用一个序列号。 FIN:释放一个连接。占用一个序列号。1.1.6 窗口大小字段占16比特。此字段用来进行流量控制。单位为字节数,这个值是本机期望
9、 一次接收的字节数。TCP的流量控制由连接的每一端通过声明的窗口大小来提供。 窗口大小为字节数,起始于确认序号字段指明的值,这个值是接收端期望接收的 字节数。窗口大小是一个16为的字段,因而窗口大小最大为65535字节。1.1.7 TCP 校验和字段占16比特。检验和覆盖整个TCP报文端:TCP首部和TCP数据。这是一个 强制性的字段,一定是由发送端计算和存储,并由接收端进行验证TCP检验和 的计算和 UDP 首部检验和的计算一样,也使用伪首部。1.1.8 紧急指针字段占16比特。它是一个偏移量,和序号字段中的值相加表示紧急数据最后一 个字节的序号。即序号值+紧急指针值=紧急数据段的终点。接收
10、方接收带有紧急指针的报文后,会将紧急数据立即送往应用层。协议的实现为了提高效率,往往在应用层传来少量的数据时不马上发送,而 是等到数据缓冲区里有了一定量的数据时才一起发送,但有些应用本身数据量并 不多,而且需要马上发送,这时,就用紧急指针,这样数据就会马上发送,而不 需等待有大量的数据。1.1.9 选项字段占 32 比特。可能包括窗口扩大因子、时间戳等选项。kLnd=Okir7 凹lkm=4耳丄报文段 长度1宇节】字节knd =3lerv=3-1字节kindL=SLen-tO吋1可魏值时宜盔冋显应答最#我文段氏廈;诧;丨扩丸因子:时间臟:kirtdP1字行4字节4字前图2 TCP扩展选项MSS
11、 协商:最大报文段长度(M S S)表示T C P传往另一端的最大块数据的长度。 当一个连接建立时,连接的双方都要通告各自的M S S。当建立一个连接时,每 一方都有用于通告它期望接收的MSS选项(M SS选项只能出现在SYN报 文段中)。如果一方不接收来自另一方的MSS值,则MSS就定为默认值53 6字节。窗口扩大因子:这个选项只能够出现在一个SYN报文段中,因此当连接建立起来后,在每 个方向的扩大因子是固定的。为了使用窗口扩大,两端必须在它们的 S Y N 报 文段中发送这个选项。主动建立连接的一方在其 S Y N 中发送这个选项,但是 被动建立连接的一方只能够在收到带有这个选项的 S Y
12、 N 之后才可以发送这个 选项。每个方向上的扩大因子可以不同。如果主动连接的一方发送一个非零的扩大因子,但是没有从另一端收到一个 窗口扩大选项,它就将发送和接收的移位记数器置为 0。时间戳: 时间戳选项使发送方在每个报文段中放置一个时间戳值。接收方在确认中返 回这个数值,从而允许发送方为每一个收到的A C K计算RT T。1.2 TCP 报文交互协议状态机或超时阿呼关叫L;收: !发迭:应用进稈:被动打开j 股送:无I-;-:LnsE_WArfj;幵捎CLOSEDTIMS WAIT;FIN_WAn_r坡朗扌)AELISHE收:ACK茨送1无r冋时天朗应用进程关闭 SYi SENT主功打开7 :
13、 ACK 2MSLWT丰哥蔚”说咱容户的止常状态蜚迁 -*说明服毎器的常状态变辻应用连程:说明当应用执行某种揀柞时按牛的状态变迂收:f见明当攻到T?就玄段时狀态的空辻发:说明対了透行某亍秋态变迁燮发迭的TCP报文戦图 3 TCP 协议状态机三次握手和次挥手1、连接建立协议建立连接时,三次握手,握手报文中不包括数据流。一个SYN占用一个序 号。(1) SN=0; SYN=1;ACK=0(2) SN=0; SYN=1;ACK=1(3) SN=1; SYN=0;ACK=1客户端发送第一个数据包SN=1;SYN=0;ACK=1 服务端发送第一个数据包:SN=1;SYN=0;ACK=1这3个报文段完成连
14、接的建立,称为三次握手。发送第一个SYN的一端将 执行主动打开,接收这个 SYN 并发回下一个 SYN 的另一端执行被动打开。 2、连接终止协议由于 TCP 连接是全双工的,因此每个方向都必须单独进行关闭。这原则是 当一方完成它的数据发送任务后就能发送一个 FIN 来终止这个方向的连接。收 到一个FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN 后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。FIN_WAIT_1FIN WA1T_2TIME WAIT图 4 三次握手和四次挥手FINN交互数据流对于交互性要求比较高的应用,TCP给出两个策略来提高发送效
15、率和减低 网络负担:(1)捎带ACK。(2)Nagle算法(一次尽量多的发数据)。通常,在 网络速度很快的情况下,比如用lo接口进行tel net通信,当按下字母键并要求 回显的时候,客户端和服务器将经历“发送按键数据 -服务器发送按键数据的 ack -服务器端发送回显数据-客户端发送回显数据的ACK”的过程,如果在广 域网里面,这种小分组的TCP流量将会造成很大的网络负担。2.1捎带ACK的发送方式这个策略是说,当主机收到远程主机的 TCP 数据报之后,通常不马上发送 ACK 数据报,而是等上一个短暂的时间,如果这段时间里面主机还有发送到远 程主机的TCP数据报,那么就把这个ACK数据报“捎带”着发送出去,把本来 两个TCP数据报整合成一个发送。一般的,这个时间是200ms。可以明显地看 到这个策略可以把 TCP 数据报的利用率提高很多。2.2 Nagle 算法上过 bbs 的人应该都会有感受,就是在网络慢的时候发贴,有时键入一串 字符串以后,经过一段时间,客户端“发疯”一样突然回显出很多内容,就好像 数据一下子传过来了一样,这