UNIT04 Transfer Control Protocol

基于连接:TCP确认机制、超时重发机制、流量控制机制

04.1 TCP Complete Reliability

一、面向连接的传输Connection Orientation

     必须先在双方之间建立一个TCP连接(不支持广播),之后才能传输数据,TCP连接的可靠建立—— 3次握手法。

三次握手法 就是在连接建立和终止过程中,通信的双方需要交换 3个报文。在数据包丢失、重复和延迟的情况下,3次握手法是保证连接无二义性的充要条件。

二、基于字节流的传输(流接口,Stream Interface)

1、字节流(以字节为最小单位的流服务)

     采用字节流方式有序传输,如果字节流太长,将其分段。

2、运输协议数据单元 Transport Protocol Data Unit

两个对等运输实体在通信时传送的数据单位叫作TPDU

TCP 传送的TPDU是 TCP 报文段(segment)

UDP 传送的TPDU是 UDP 报文或用户数据报

三、端到端的全双工通信Full Duplex Communication

1、从本质上说,由物理层、数据链路层和网络层组成的通信子网为网络环境中的主机提供点到点的服务。

2、传输层为网络中的主机提供端到端的通信。端到端是逻辑链路,端到端是由无数的点到点实现和组成的。

四、紧急数据传送功能

1、任何一个TCP输出段都可以携带紧急数据(Urgent Data), 以支持上层协议间紧急信息的快速传递。紧急数据必须位于数据段中所有数据的最前端, 并在TCP段头中设置如下字段:

    ①设置URG标志位, 表示当前数据段中携带有紧急数据。

    ②设置紧急指针。紧急指针与当前输出段的序号之和指出数据流中紧急数据最后一个字节。对于一个包含该字节的数据段来讲, 其紧急数据长度从段序号开始一直延续到该字节为止。

2、当接收方TCP收到含有紧急数据的TCP数据段后, 首先把紧急数据从正常数据流中分离出来, 并保存在适当地方。然后, 以一定的方式通知上层协议,希望它尽快地响应和处理。

3、当发送方TCP接到上层协议递交的紧急数据后, 并不是立即发送紧急数据,而是把它们排入正常数据的发送队列中。此后, 发送方TCP每发送一个数据段都要带有URG标志和紧急指针, 直到出现真正含有紧急数据的数据段为止; 不过越靠后的数据段紧急指针的值就越小。也就是说,只有包含紧急指针所指示的字节的数据段才真正含有紧急数据, 从段序号开始到该字节为止皆为紧急数据。此外, 发送方TCP即使发送窗口为 0 时也要对带有URG标志的数据段实行强制发送, 不管它们是否含有紧急数据。

五、阻塞/流量控制机制

1TCP使用Maximum Segment Size窗口机制进行流量控制

2、什么是窗口?

连接建立时,各端分配一块缓冲区用来存储接收的数据,并将缓冲区的尺寸发送给另一端。

接收方发送的确认信息中包含了自己剩余的缓冲区尺寸

剩余缓冲区空间的数量叫做窗口

3TCP 采用大小可变的滑动窗口字节数进行流量控制。

发送和接受方都会维护一个数据帧的序列,这个序列被称作窗口。发送方的窗口大小由接受方确定,目的在于控制发送速度,以免接受方的缓存不够大,而导致溢出,同时控制流量也可以避免网络拥塞。

拥塞窗口的原理很简单,TCP发送方首先发送一个数据报,然后等待对方的回应,得到回应后就把这个窗口的大小加倍,然后连续发送两个数据报,等到对方回应以后,再把这个窗口加倍(先是2的指数倍,到一定程度后就变成现行增长(这就是所谓的慢启动),发送更多的数据报,直到出现超时错误,这样,发送端就了解到了通信双方的线路承载能力,也就确定了拥塞窗口的大小,发送方就用这个拥塞窗口的大小发送数据。

六、TCP的一般工作过程

它会后续的数据包状态进行跟踪,确保传输数据的正确性(回包确认:重发丢失的封包;舍弃重复的封包),不出现丢失或乱序。

①发送方首先发送第一个包含序列号为1(可变化)和1460字节数据的TCP报文段给接收方。接收方以一个没有数据的TCP报文段来回复(只含头标),用确认号1461来表示已完全收到并请求下一个报文段。

②发送方然后发送第二个包含序列号为1461和1460字节数据的TCP报文段给接收方。正常情况下,接收方以一个没有数据的TCP报文段来回复,用确认号2921(1461+1460)来表示已完全收到并请求下一个报文段。发送接收这样继续下去。

③然而当这些数据包都是相连的情况下,接收方没有必要每一次都回应。比如,他收到第1到5条TCP报文段,只需回应第五条就行了。在例子中第3条TCP报文段被丢失了,所以尽管他收到了第4和5条,然而他只能回应第2条。

④发送方在发送了第三条以后,没能收到回应,因此当时钟(timer)过时(expire)时,他重发第三条。(每次发送者发送一条TCP报文段后,都会重启动一次时钟:RTT)。

⑤这次第三条被成功接收,接收方可以直接确认第5条,因为4,5两条已收到。

 04.2 TCP SEQ & ACK

TCP的序列号和确认号用来对收到的对方的数据包进行确认。数据分段中的序列号可以保证所有传输的数据按照正常的次序进行重组,而且通过确认保证数据传输的完整性。序列号和确认号是以字节数为单位的,确认号等于发送方的序列号加1。

一、序列号和确认号的简介及作用

     TCP 之所以可靠,是因为它保证了传送数据包的顺序。顺序是用一个序列号来保证的。响应包内也包括一个序列号J+1,表示希望发到下一个报文的编号从J+1开始。

     在TCP 传送一个数据包时,它会把这个数据包放入重发队列中,同时启动计时器,如果收到了关于这个包的确认信息,便将此数据包从队列中删除,如果在计时器超时的时候仍然没有收到确认信息,则需要重新发送该数据包。

     另外,TCP 通过数据分段中的序列号来保证所有传输的数据可以按照正常的顺序进行重组,从而保障数据传输的完整。

二、TCP 的通讯过程

     在 TCP 通讯中主要有连接的建立、数据的传输、连接的关闭三个过程!每个过程完成不同的工作,而且序列号和确认号在每个过程中的变化都是不同的。

1、TCP 建立连接(这里以客户端向服务器发起连接来说明)

第 1 步:Client→置SYN标志 序列号=J,确认号=0→Server

客户端向服务器发送一个同步数据包请求建立连接,该数据包中,初始序列号(ISN)是客户端随机产生的一个值,确认号是0;

第 2 步:Client←置SYN+ACK标志 序列号=K, 确认号=J+1←Server

服务器收到这个同步请求数据包后,会对客户端进行一个同步确认。这个数据包中,序列号(ISN)是服务器随机产生的一个值,确认号是客户端的初始序列号+1

第 3 步:Clinet→置ACK标志 序列号=J+1,确认号=K+1→Server

客户端收到这个同步确认数据包后,再对服务器进行一个确认。该数据包中,序列号是上一个同步请求数据包中的确认号值,确认号是服务器的初始序列号+1

     注意:因为一个SYN 将占用一个序号,所以要加1。

初始序列号(ISN)随时间而变化的,而且不同的操作系统也会有不同的实现方式,所以每个连接的初始序列号是不同的。TCP 连接两端,会在建立连接时,交互一些信息,如窗口大小、MSS 等,以便为接着的数据传输做准备。

     RFC793指出ISN可看作一个32bit的计数器,每4ms 加1,这样选择序号的目的在于防止在网络中被延迟的分组在以后被重复传输,而导致某个连接的一端对它作错误的判断。

2、TCP传输数据(为简化,这里只谈Server向Client发数据)

     服务器向客户端发送一个数据包后,客户端收到这个数据包后,会向服务器发送一个确认数据包。传输数据的简要过程如下:

发送数据:Clinet←序列号=J+1,确认号=K+1←Server

服务器向客户端发送一个带有数据的数据包,该数据包中的序列号和确认号与建立连接第三步的数据包中的序列号和确认号相同;

确认收到:Client→序列号=K+1, 确认号=J+1→Server

客户端收到该数据包,向服务器发送一个确认数据包,该数据包中,序列号是为上一个数据包中的确认号值,而确认号为服务器发送的上一个数据包中的序列号+所该数据包中所带数据的大小。

     这里要说明的是:建立链接时,Client端宣称自己的初始序列号是J,Server端宣称自己的初始序列号是K,但是建立连接后的数据包却各自中初始序列号+1开始,这是因为SYN请求本身需要占用一个序列号。

ISN编号是对TCP要传输的数据部分中的字节进行编号,但第一个编号并不是标识第一个字节,而是在0-(2的32次方)之间产生的一个随机数作为第一个编号。

Sequence Number:当前传输的数据中的第一个字节的编号

ACKn:下一次接收到的报文的第一个字节的编号。

例如:data=5000,ISN=10000。则编号为10001--12000。但要分5个报文段进行传输,每个报文段传1000字节;seq为:

A发:seq=10001(10001-11000)

B发:ACKn=11001(11000+1希望发到下一个报文的编号从11001开始)

A发:seq=11001(11001-12000)

 

3、TCP 关闭连接

     在TCP 关闭连接时,首先关闭的一方(即发送第一个终止数据包的)将执行主动关闭,而另一方(收到这个终止数据包的)再执行被动关闭。关闭连接的4 个步骤如下:

第 1 步:服务器完成它的数据发送任务后,会主动向客户端发送一个终止数据包,以关闭在这个方向上的TCP 连接。该数据包中,序列号为客户端发送的上一个数据包中的确认号值,而确认号为服务器发送的上一数据包中的序列号+该数据包所带数据的大小;

第 2 步:客户端收到服务器发送的终止数据包后,将对服务器发送确认信息,以关闭该方向上的TCP 连接。这时的数据包中,序列号为第1 步中的确认号值,而确认号为第1 步的数据包中的序列号+1;

第 3 步:同理,客户端完成它的数据发送任务后,就也会向服务器发送一个终止数据包,以关闭在这个方向上的TCP 连接,该数据包中,序列号为服务器发送的上一个数据包中的确认号值,而确认号为客户端发送的上一个数据包中的序列号+该数据包所带数据的大小;

第 4 步:服务器收到客户端发送的终止数据包后,将对客户端发送确认信息,以关闭该方向上的TCP 连接。这时在数据包中,序列号为第3 步中的确认号值,而确认号为第3 步数据包中的序列号+1;

     注意:因为FIN 和SYN 一样,也要占一个序号。理论上服务器在TCP 连接关闭时发送的终止数据包中,只有终止位是置1,然后客户端进行确认。但是在实际的TCP 实现中,在终止数据包中,确认位和终止位是同时置为1 的,确认位置为1 表示对最后一次传输的数据进行确认,终止位置为1 表示关闭该方向的TCP 连接。

4、Resetting a connection

四次握手不是关闭TCP连接的唯一方法。有时,如果主机需要尽快关闭连接(或连接超时,端口或主机不可达),RST (Reset)包将被发送。注意,由于RST包不是TCP连接中的必须部分, 可以只发送RST包(即不带ACK标记), 但在正常的TCP连接中RST包可以带ACK确认标记。

5、为什么TIME_WAIT状态还需等2MSL后才能返回CLOSED状态?

(2MSL=twice Maximum Segment Leftime=240s)

这是因为虽然双方都同意关闭连接了,而且握手的4个报文也都协调和发送完毕,按理可以直接回到CLOSED状态;但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的ACK报文会一定被对方收到,因此对方处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的ACK报文。

三、TCP state exchange(netstat –n –p tcp)

1、TCP状态

LISTEN

侦听来自远方的TCP端口的连接请求

SYN-SENT

再发送连接请求后等待匹配的连接请求

SYN-RECEIVED

再收到和发送一个连接请求后等待对方对连接请求的确认

ESTABLISHED

代表一个打开的连接

FIN-WAIT-1

等待远程TCP连接中断请求,或先前的连接中断请求的确认

FIN-WAIT-2

从远程TCP等待连接中断请求

CLOSE-WAIT

等待从本地用户发来的连接中断请求

CLOSING

等待远程TCP对连接中断的确认

LAST-ACK

等待原来的发向远程TCP的连接中断请求的确认

TIME-WAIT

等待足够的时间以确保远程TCP接收到连接中断请求的确认

CLOSED

没有任何连接状态

2、TCP状态变换

客:CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED

服:CLOSED->LISTEN->SYN收到 ->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED

3、为什么建立连接是三次握手,而关闭连接却是四次握手呢?

这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。

关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你不可以马上关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。


 

04.3 TCP Segment MSG

一、TCP报文段结构

TCP报文段首部的前20个字节是固定的,后面有4n字节是可有可无的选项。因此TCP首部的最小长度是20字节,160位。

二、TCP数据报格式说明

源端口/目的端口

source port/ destination port

各包含一个TCP端口编号,分别标识连接两端的两个应用程序。本地的端口编号与IP主机的IP地址形成一个惟一的套接字。双方的套接字惟一定义了一次连接。

序列号(sequence number

用于标识TCP段数据区的开始位置

确认号

acknowledgement number

用于标识接收方希望下一次接收的字节序号

TCP头标长度(header length

说明TCP头部长度,该字段指出用户数据的开始位置

标志位(code

分为六个标志:紧急标志位URG、确认标志位ACK、急迫标志位PSH、复位标志位RST、同步标志位SYN、终止标志位FIN

窗口尺寸(window size

在窗口中指明缓存器尺寸,用于流量控制和拥塞控制

校验和(checksum

用于检验头部、数据和伪头部

紧急数据指针(urgent pointer

表示从当前顺序号到紧急数据位置的偏移量。它与紧急标志位URG配合使用

任选项(options

提供常规头部不包含的额外特性。如所允许的最大数据段长度,默认为536字节。其他还有选择重发等选项。

数据

用于封装上层数据

三、在TCP分段头中包含6个标志位

在TCP首部中有6个标志比特。它们中的多个可同时被设置位

1、SYN(Synchronize Sequence Numbers)

     它是用来建立连接,让连接双方同步序列号。如果SYN=l,而ACK=0,则表示该数据包为连接请求;如果SYN=l,而ACK=I则表示接受连接。该标志仅在三次握手建立TCP连接时有效,该序列编号为TCP连接初始端(一般是客户端)的初始序列编号。

2、FIN:结束标志位

     表示发送端已经没有数据要求传输了,希望释放连接。带有该标志置位的包用来结束一个TCP会话,但对应端口仍处于开放状态,准备接收后续数据。

3、RST:重建连接

     用于复位相应的TCP连接。RST标志位的数据包称为复位包,一般情况下,如果TCP协议收到的一个分段明显不是属于该计算机上的任何一个连接,则向远端发一个复位包。

4、URG(The Urgent Pointer):紧急数据标志位

     在紧急指针字段中有效。如果它为l,紧急标志置位。表示本数据包中包含紧急数据,需要优先发送。

5、ACK(Acknowledgement Number):确认标志位

     在确认号字段中有效。置1时,表示确认号(Acknowledgment Number)为合法,为0时,表示数据段不包含确认信息,确认号被忽略。大多数情况下该标志位是置位的。TCP头标内的确认编号栏内包含的确认编号为下一个预期的序列编号,同时提示远端系统已经成功接收所有数据。

6、PSH(Push):置位标志

     该标志置l位时,接收端不将该数据进行队列处理,而是尽可能快将数据转由应用处理。在处理Telnet或Rlogin等交互模式的连接时,该标志总是置位的。

四、Invalid TCP Flags攻击包

ACK包就是仅ACK 标记设为1的TCP包。需注意当三此握手完成、连接建立以后,TCP连接的每个包都会设置ACK位。这就是为何连接跟踪很重要的原因了,而当状态型防火墙收到此种包时,它会先在连接表中查找是否属于哪个已建连接,否则丢弃该包。

SYN/RST

SYN/FIN

SYN/FIN/PSH

SYN/FIN/RST

SYN/FIN/RST/PSH

FIN (无ACK标记)

NULL(URG,ACK,PSH,RST,SYN,FIN都为0)

 

 


 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值