TCP 传输协议
TCP 连接建立协议
名词解释:序号用来标识 从TCP发端向TCP接收端发送的数据字节流,它表示在这个报文段中的第一个数据字节。
主要字段解释:
① 32 位序列号:该序列号有自己随机产生 , 用于ACK的确认 ,这个字段一致存在
② 32 位确认序列号:等于上次已成功接收到数据字节序号加1,并且只有ACK标志为1时确认序列号才有效,我们可以看到,在client第一个发送command时,该字段被设为0 , ACK也是 0
③ U R G 紧急指针(u rgent pointer)有效(见2 0 . 8节)。
④ A C K 确认序号有效。
⑤ P S H 接收方应该尽快将这个报文段交给应用层。
⑥ R S T 重建连接。
⑦ S Y N同步序号用来发起一个连接。这个标志和下一个标志将在第 1 8章介绍。
⑧ F I N 发端完成发送任务。
下面看一下三次握手的过程:
Client ----》 Server
第一个报文段
此时 Sequence number (32 位序列号) = 1609666383 , 发送方 自己
ACK number = 0
ACK =0
SYN = 1
Serve---》Client
第二个报文段
此时:
Sequence Number: 1200338241 ,发送方 自己
Ack Number: 1609666384
ACK : 1
SYN : 1
Client--->Server
第三个报文段
Sequence Number: 1609666384
Ack Number: 1200338242
Ack : 1
SYN : 0
下面进行总结:
Client :
Sequence number (32 位序列号) = 1609666383 ----------------》Sequence Number: 1609666384
ACK number = 0 ---》Ack Number: 1200338242
Server :
Sequence Number: 1200338241 ,发送方 自己
Ack Number: 1609666384
TCP连接终止协议
建立一个连接需要三次握手,而终止一个连接要经过 4次握手。这由T C P的半关闭(h a l f -c l o s e)造成的。既然一个T C P连接是全双工(即数据在两个方向上能同时传递),因此每个方向必须单独地进行关闭。这原则就是当一方完成它的数据发送任务后就能发送一个 F I N来终止这个方向连接。当一端收到一个 F I N,它必须通知应用层另一端几经终止了那个方向的数据传送。发送F I N通常是应用层进行关闭的结果。
收到一个F I N只意味着在这一方向上没有数据流动。一个 T C P连接在收到一个F I N后仍能发送数据。而这对利用半关闭的应用来说是可能的,尽管在实际应用中只有很少的T C P应用程序这样做。正常关闭过程如图1 8 - 3所示。我们将在1 8 . 5节中详细介绍半关闭。
首先进行关闭的一方(即发送第一个 F I N)将执行主动关闭,而另一方(收到这个 F I N)执行被动关闭。通常一方完成主动关闭而另一方完成被动关闭,但我们将在 1 8 . 9节看到双方如何都执行主动关闭。
图1 8 - 3中的报文段4发起终止连接,它由Te l n e t客户端关闭连接时发出。这在我们键入 q u i t命令后发生。它将导致T C P客户端发送一个F I N,用来关闭从客户到服务器的数据传送。
当服务器收到这个 F I N,它发回一个A C K,确认序号为收到的序号加 1(报文段5)。和S Y N一样,一个F I N将占用一个序号。同时T C P服务器还向应用程序(即丢弃服务器)传送一个文件结束符。接着这个服务器程序就关闭它的连接,导致它的 T C P端发送一个F I N(报文段6),客户必须发回一个确认,并将确认序号设置为收到序号加1(报文段7)。图1 8 - 4显示了终止一个连接的典型握手顺序。我们省略了序号。在这个图中,发送F I N将导致应用程序关闭它们的连接,这些F I N的A C K是由T C P软件自动产生的。
连接通常是由客户端发起的,这样第一个 S Y N从客户传到服务器。每一端都能主动关闭这个连接(即首先发送 F I N)。然而,一般由客户端决定何时终止连接,因为客户进程通常由用户交互控制,用户会键入诸如“ q u i t”一样的命令来终止进程。在图 1 8 - 4中,我们能改变上边的标识,将左方定为服务器,右方定为客户,一切仍将像显示的一样工作(例如在1 4 . 4节中的第一个例子中就是由d a y t i m e服务器关闭连接的)。
18.2.5 正常的t c p d u m p输出对所有的数值很大的序号进行排序是很麻烦的,因此默认情况下 t c p d u m p只在显示S Y N报文段时显示完整的序号,而对其后的序号则显示它们与初始序号的相对偏移值(为了得到图1 8 - 1的输出显示必须加上- S选项)。对应于图1 8 - 1的正常t c p d u m p显示如图1 8 - 5所示:除非我们需要显示完整的序号,否则将在以下的例子中使用这种形式的输出显示。
下面是抓包情况:
Server ip : 192.168.137.1
Client ip: 192.168.137.128
第一个报文段:
Server ----》Client
第二个报文段:
Client---》Server
第三个报文段:
Client---》Server
第四个报文段:
Server--》Client
TCP的半关闭
T C P提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。这就是所谓的半关闭。正如我们早些时候提到的只有很少的应用程序使用它。
半关闭一般是由接收方先发送FIN