动手学习TCP系列之TCP连接建立与终止(1)


TCP是一个面向连接的协议,任何一方在发送数据之前,都必须先在双方之间建立一条连接。所以,本文就主要看看TCP连接的建立和终止。

在开始介绍TCP连接之前,先来看看TCP数据包的首部,首部里面有很多重要的字段,在我们实现程序的时候需要进行设置。

TCP的首部

在OSI七层模型中,上层的数据包都会作为下层数据包的数据部分(payload)。

也就是说,当构造TCP数据包的时候,会把应用层的数据包作为TCP包的数据部分,然后加上TCP头构成TCP数据包;同样,当构造IP数据包的时候,整个TCP包就会被当作数据部分,然后加上IP头构成IP数据包。

 

TCP头的数据格式如下,在不包括可选字段的情况下,一般TCP头会占用20个字节。

 

在TCP首部中,有几个字段是需要关注一下:

在TCP首部中没有源和目标的IP、MAC地址(IP和MAC地址分别是网络层和链路层首部的信息),只有源和目标的端口

Sequence Number是包的序号,网络层(IP层)的传输是不可靠的,可能产生包乱序,所以这个需要可以解决网络包乱序的问题

Acknowledgement Number用来确认收到数据包的确认序号,为TCP的传输提供了可靠性保证

TCP Flags包括了8个bit,通过对这些bit的设置,可以代表不同类型的TCP数据包

下面就看看TCP连接的建立和终止。

TCP连接建立

TCP连接建立的过程被称为三次握手过程:

连接建立发起端发送[SYN]包,该端将主动打开(active open)

接收端将发送[SYN, ACK]包,该端将被动打开(passive open),ACK标志表示对收到的[SYN]包的确认

连接建立发起端发送[ACK]包确认[SYN, ACK]包

 

Initial Sequence Number

连接建立过程中,一个重要的工作就是初始化Sequence Number,通信的双方在建立连接的过程中互相通知对方自己的初始Sequence Number(ISN:Initial Sequence Number)。ISN不是固定的,ISN跟时钟绑定,根据特定的间隔自增,直到超过2^32,又从0开始。

SYN全称就是Synchronize Sequence Number,通过seq序号,TCP就可以保证数据包的顺序;通过ack序号,TCP就有了可靠性。

连接建立注意点

在建立TCP连接的过程中,有以下两点需要注意一下:

[SYN]标志的数据包会使用消耗一个序号,所以对端的确认号(ack)是当前序号(seq)加一

当被动打开端发送[ACK]确认包的时候,同时设置了[SYN]标志,所以TCP连接建立的过程只需要三次握手,而不是四次

TCP连接终止

TCP连接终止的过程被称为四次挥手过程,以下图为例:

连接终止端(client)发送[FIN, ACK] 包,关闭client到server方向的数据发送通路

server端发送[ACK]包来确认来自client的[FIN, ACK] 包

server端发送[FIN, ACK] 包,关闭server到client方向的数据发送通路

client端发送[ACK]包来确认来自server的[FIN, ACK] 包,到此TCP连接关闭

 




相关内容