建立连接的步骤例如以下:
- client发送一个SYN段表示发起连接请求,该段中包括一个初始序号ISN。
- server也发送一个SYN段并包括它自己的初始序号ISN。同一时候设置ACK标志表示对上一个client的SYN的确认。确认序号为client的ISN值加1,该确认序号表示server希望下一次收到的起始序号。
- client再发送一个ACK以确认server发来的SYN,确认序号为serverISN加1,含义同上。
三次握手完毕,连接建立。
以下以HTTP为例。
在HTTP发送第一个请求之前,须要建立TCP连接。也就是三次握手,这三个TCP数据包不包括不论什么有效数据字节。通过Wireshark来分析三次握手的详细流程。这里有一点须要记住:确认信号应当是上一次已成功收到数据字节序号加1。
第一次握手:
这是client(我的电脑)发出的TCP头。client的port号是59313。server的port号是80,client生成的初始序列号x为0。标志位为SYN表示client请求建立连接。
第二次握手:
这是server返回的应答TCP头。
server也生成一个初始序列号y为0。同一时候将确认序号设为x加1以对client的SYN报文段进行确认,标志位为SYN和ACK。
第三次握手:
client收到server的应答后再次发送一个ACK作为应答。响应序号为y+1以响应server的SYN报文段。由于是第二次发送,所以该ACK的序号为1,但由于ACK不消耗序号。在连接建立之后发送第一个数据时,该序号仍然是1.
注意。Wireshark在这里所显示的序号均为相对序号,相对于某个基准值。该基准值的产生随时间变化。
基准值加上相对序号才是TCP包真正的序号。
參考:
《TCP/IP具体解释》 P174-P176.
时间: 2024-12-20 16:16:19