1、TCP连接的目的
(1)让发送方、接收方感知对方的存在
(2)发送方、接收方协商相关参数(各自的起始序号,接收能力,MSS,窗口扩大,时间戳等等)
(3)根据双方的协商分配资源(发送缓存,接收缓存等)
2、TCP连接建立过程
(1)A向B发送TCP连接请求,SYN=1消耗一个序号seq=x;
(2)B发送连接接受报文SYN=1,对A的序号为x的报文进行确认,故确认号有效ACK=1,ack_seq=x+1,seq=y,y是B的起始序号;
(3)A对B进行确认,ACK=1,ack_seq=y+1;seq=x+1(备注:(a)此时可以发送数据了序号从x+1开始,顺带确认,如果不发送数据seq=x+1,此时并不消耗序号x+1,后面数据发送序号仍然从x+1开始)
(4)如上所述,TCP在三报文握手期间会消耗掉一个序号,但这对数据传输没有任何影响。
3、Wireshark抓包实例分析
(1)连接请求(标志syn=1,ACK=0)
TCP连接请求报文:SYN=1,seq=0(发送方的起始序号为0),ACK控制位=0,此时确认号无效,即没有确认,此时我们很多时候可能看到ack_seq=0,但只要ACK控制位=0,它就无效,任何确认都不可能是0,因为序号最小从0开始,确认号最少从1开始。另外该TCP报文的源端口号为10530,目的端口号80,在确认报文中,源端口号和目的端口号将对调。
在数据中,我们还可以看到Sequence Number (raw),这是TCP协议中表示数据包起始字节编号的原始值,用于标识数据流中的每个字节。具体解析如下:
- 原始值:表示数据包起始字节的绝对编号,通常为一个大整数(如1150047968);
- 相对值:在通信中显示为相对序列号(如0),表示相对于连接建立时的起始值。
(2)连接接受报文(SYN=1,ACK=1,ack_seq=1)TCP连接接受报文:ACK=1,SYN=1,ack_seq=1(这是对对方,即发送方0序号的确认),seq=0,接收方的起始序号。此时发送方知道,接收方已经感知到它的存在了。源端口号80,目的端口号10530。Sequence Number (raw)原始值为1627912451,Acknowledgment Number (row) 1150047969,是对1150047968的确认。在这里理解时,我们使用相对的还是绝对的都可以。
(3)发送对接收方的确认
ACK=1,ack=1,此时SYN不再等于1。这是对接收方连接接受报文的确认,对方收到后,连接建立完成。同时开始发送数据。
4.408考研部分试题
试题一:
若主机甲主动发起一个与主机乙的 TCP 连接,甲、乙选择的初始序列号分别为 2018和
2046,则第三次握手TCP段的确认序列号是( )。
A 2018 B 2019 C 2046 D 2047
分析:
(1)TCP连接请求中,seq=2018,ACK=0,确认号ack无效
(2)TCP连接接受报文中,seq=2046,ACK=1,ack=2019
(3)TCP确认中,seq=2019,ACK=1,ack=2047
试题二:若主机甲与主机乙建立TCP连接时,发送的SYN段中的序号为1000,在断开连接时,甲发送给乙的FIN段中的序号为5001,则在无任何重传的情况下,甲向乙已经发送的应用层数据的字节数为( )。
A 3999 B 4000 C 4001 D 4002
分析:
(1)TCP连接时初始序号为1000;
(2)实际数据序号从1001开始
(3)断开连接的确认号为5001
(4)对方的接收数据最大序号为5000
(5)数据编号:1001-5000共4000




