一个完整的TCP通讯流程(转)
这次,我们在实验环境中,通过一个完整的TCP从三次握手建立连接,互相各发送一个数据报,然后通过四次握手断开连接的流程,来看看一般的TCP网络通讯
是怎么一个样子的。我们还是在172.16.48.13(以下简称13)上建立一个TCP客户端进程,连接172.16.48.1(以下简称1)的
5002端口。然后向1发送一个数据报,1收到后,向13也发送一个数据,然后13发送FIN主动断开连接。1也随后发送它的FIN,完成断开连接,这整
个过程,总共有11个数据报,其中三次握手3个,数据通讯4个,断开连接4个。下面我们列出这11个数据报的主要内容,为简洁起见,略去如源和目的端口等
一些非关键信息。
序号 确认序号 标志 数据
三次握手建立连接:
13发送SYN: 0x000007bc(0) 0x00000000(0) SYN 无
1发送ACK,
并同时发送SYN: 0xab2b9dc7(0) 0x000007bd(1) SYN ACK 无
13发送ACK: 0x000007bd(1) 0xab2b9dc8(1) ACK 无
数据收发:
13发送数据报: 0x000007bd(1) 0xab2b9dc8(1) PSH ACK 21字节负载数据
1发送ACK: 0xab2b9dc8(1) 0x000007d2(22) ACK 无
1发送数据报: 0xab2b9dc8(1) 0x000007d2(22) PSH ACK 34字节负载数据
13发送ACK: 0x000007d2(22) 0xab2b9dea(35) ACK 无
四次握手断开连接:
13发送FIN: 0x000007d2(22) 0xab2b9dea(35) FIN ACK 无
1发送ACK: 0xab2b9dea(35) 0x000007d3(23) ACK 无
1发送FIN: 0xab2b9dea(35) 0x000007d3(23) FIN ACK 无
13发送ACK: 0x000007d3(23) 0xab2b9deb(36) ACK 无
表中序号后面的括号中是十进制的相对序号,从零开始。三次握手完成,两端因为各发送一个SYN而各占用一个序号,数据收发阶段,13发送一个21字节的数
据报,占用21个序号,1发送一个34字节的数据报而占用34个序号,断开连接阶段,两端因为各发送一个FIN而各占用一个序号。所以,最后,13共占用
1+21+1=23个序号(0-22),而1共占用1+34+1=36个序号(0-35)。
从表中可以看到,如果一端发送一个数据报后,不需要对端回应,紧接着发送第二个数据报,则这两个数据报实际上会ACK对端的同一个数据报,表中,13的第
一个ACK和(PSH
ACK),都应答了1的(ACK,SYN)。在数据通讯阶段,TCP协议对收到的每一个数据报都要进行ACK确认,否则对方会超时重传。