TCP连接的建立过程

TCP是一个面向连接和协议,在发送数据之前,任何交互都要基于连接才能完成。本博文讨论连接的建立过程。

我在本机上打开一个端口,然后对这个端口telnet,连接之后,会将其断开,并用tcpdump对其TCP数据传输进行输出,如果对TCP首部不是特别了解,可以参考博文【TCP/IP:认识TCP

一,测试输出

调用telnet

telnet 192.168.1.105 5210

输出如下:

[root@localhost /]# tcpdump -S tcp port 5210
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
18:36:14.762904 IP 192.168.1.102.49288 > 192.168.1.105.5210: S 313624018:313624018(0) win 8192 <mss 1460,nop,wscale 2,nop,nop,sackOK>
18:36:14.773698 IP 192.168.1.105.5210 > 192.168.1.102.49288: S 4078776998:4078776998(0) ack 313624019 win 5840 <mss 1460,nop,nop,sackOK,nop,wscale 7>
18:36:14.773902 IP 192.168.1.102.49288 > 192.168.1.105.5210: . ack 4078776999 win 16425
18:36:14.764642 IP 192.168.1.105.5210 > 192.168.1.102.49288: P 4078776999:4078777013(14) ack 313624019 win 46
18:36:14.765099 IP 192.168.1.105.5210 > 192.168.1.102.49288: F 4078777013:4078777013(0) ack 313624019 win 46
18:36:14.765341 IP 192.168.1.102.49288 > 192.168.1.105.5210: . ack 4078777014 win 16421
18:36:14.775762 IP 192.168.1.102.49288 > 192.168.1.105.5210: F 313624019:313624019(0) ack 4078777014 win 16421
18:36:14.775802 IP 192.168.1.105.5210 > 192.168.1.102.49288: . ack 313624020 win 46

注:上面的tcpdump 命令中-S选项不是必须的,只是为了输出具体的ISN值,而不是基于第一个根据时间随机的ISN的偏移值。在没有-S选项时,输出会是下面这种形式:

[root@localhost /]# tcpdump tcp port 5210
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
18:52:33.996202 IP 192.168.1.102.49317 > 192.168.1.105.5210: S 2455039660:2455039660(0) win 8192 <mss 1460,nop,wscale 2,nop,nop,sackOK>
18:52:34.012040 IP 192.168.1.105.5210 > 192.168.1.102.49317: S 828175062:828175062(0) ack 2455039661 win 5840 <mss 1460,nop,nop,sackOK,nop,wscale 7>
18:52:34.012091 IP 192.168.1.102.49317 > 192.168.1.105.5210: . ack 1 win 16425
18:52:33.999654 IP 192.168.1.105.5210 > 192.168.1.102.49317: P 1:15(14) ack 1 win 46
18:52:34.000172 IP 192.168.1.105.5210 > 192.168.1.102.49317: F 15:15(0) ack 1 win 46
18:52:34.000432 IP 192.168.1.102.49317 > 192.168.1.105.5210: . ack 16 win 16421
18:52:34.011735 IP 192.168.1.102.49317 > 192.168.1.105.5210: F 1:1(0) ack 16 win 16421
18:52:34.011764 IP 192.168.1.105.5210 > 192.168.1.102.49317: . ack 2 win 46

由于没有数据,这些输出只是包含了TCP连接的首部数据,每个输出行开始的格式都是:

源 > 目的:标志
这里的源和目的容易理解,表示IP和端口,这里的标志表示TCP首部中的6个标志比特,如上面的输出中就包含了S,P,F。在这里可能会出现5种标志,分别表示如下:

  1. S。表示SYN,用于同步的序号。
  2. F。表示FIN,用于发送方完成数据发送。
  3. R。表示RST ,复位连接。
  4. P。PSH,尽可能快地将数据发送到接收进程。
  5. .。表示以上四个标志比特均为0。
二,数据行分析

如上文中的第二行
18:36:14.773698 IP 192.168.1.105.5210 > 192.168.1.102.49288: S 4078776998:4078776998(0) ack 313624019 win 5840 <mss 1460,nop,nop,sackOK,nop,wscale 7>
行中的4078776998:4078776998(0)字段表示分组的序号为4078776998,而报文中数据字节数为0。tcpdump显示这个字段的格式是开始的序号:隐含的结尾序号(数据字节数),因为这里数据字节为0,所以开始的序号和结尾的序号是相等的。这个字段不是所有的输出行中都有显示,只有以下两种情况才会显示:
  1. 报文段中至少包含一个数据字节。
  2. SYN,FIN,RST被设置为1。
后面的ack313624019 表示确认序号,只有在首部的ACK标志比特被设置为1时才显示。由于第二行是服务器发送给客户端的数据,这里表示服务器给客户端的应答,事实上可以看出,在第一行中包含的序号为313624018,所以以加1作为应答,这也是三次握手的一个过程。

win 5840表示窗口的大小。这里没有数据交换,窗口是一个默认的窗口值。
mss 1460表示由发送端指明的最大报文段长度选项,发送端将不接收超过这个长度的TCP报文段。从上面的tcpdump结果可以看出,连接的双方都要通告各自的MSS,先简单的认为两个端都是直接连接的,因为MSS的设置大小和MTU有一定的关系,而MTU和路径的选择也有或多或少的关联。

三,连接过程

根据上面的tcpdump输出来讨论一下建立连接的过程,这当然是三个步骤:
  1. IP 192.168.1.102.49288 > 192.168.1.105.5210: S。表示客户端发送一个SYN段,连接服务器的端口,并包含初始化的序号(ISN,看上面的输出为313624018),这个SYN段就是第一个报文,同时报告窗口大小和MSS值。
  2. IP 192.168.1.105.5210 > 192.168.1.102.49288: S。表示服务器发回包含服务器的初始序号的SYN报文段作为应答,同时将确认序号设置为客户的ISN加1以对客户端的SYN报文进行确认,这里一个SYN占用一个序号,并告诉窗口大小和MSS值。
  3. IP 192.168.1.102.49288 > 192.168.1.105.5210:. ack 4078776999 win 16425,这是客户端对服务器序号4078776998的一个应答。这里的标志位“.”表示SFRP四个标识位都是0,当然后此时的ACK标识位是1。
四,关于连接超时

在无法建立连接时,如TELNET一个没有提供服务的端口,此时telnet会不断的发送SYN序号。如下的例子,连接一个没有提供服务的端口,但也不是直接拒绝连接,此时客户端会重新连接一定的次数和达到指定的超时时间时,会认为是连接超时,如下的输出:
19:02:19.526955 IP 192.168.1.105.38890 > 4.38.89.117.broad.nj.js.dynamic.163data.com.cn.8625: S 1446215798:1446215798(0) win 5840 <mss 1460,sackOK,timestamp 1562973 0,nop,wscale 7>
19:02:22.529755 IP 192.168.1.105.38890 > 4.38.89.117.broad.nj.js.dynamic.163data.com.cn.8625: S 1446215798:1446215798(0) win 5840 <mss 1460,sackOK,timestamp 1565973 0,nop,wscale 7>
19:02:28.532807 IP 192.168.1.105.38890 > 4.38.89.117.broad.nj.js.dynamic.163data.com.cn.8625: S 1446215798:1446215798(0) win 5840 <mss 1460,sackOK,timestamp 1571973 0,nop,wscale 7>
19:02:40.537427 IP 192.168.1.105.38890 > 4.38.89.117.broad.nj.js.dynamic.163data.com.cn.8625: S 1446215798:1446215798(0) win 5840 <mss 1460,sackOK,timestamp 1583973 0,nop,wscale 7>
19:03:04.583216 IP 192.168.1.105.38890 > 4.38.89.117.broad.nj.js.dynamic.163data.com.cn.8625: S 1446215798:1446215798(0) win 5840 <mss 1460,sackOK,timestamp 1607973 0,nop,wscale 7>
19:03:53.302771 IP 192.168.1.105.38890 > 4.38.89.117.broad.nj.js.dynamic.163data.com.cn.8625: S 1446215798:1446215798(0) win 5840 <mss 1460,sackOK,timestamp 1655973 0,nop,wscale 7>
从上面的输出,可以看到:第一次连接没有应答后,隔3秒之后,又发送一个SYN报文,然后是6秒,12秒,24秒,48秒。。。。。。,直到达到最大的一个重新发送的次数,这个时间间隔,在不同的TCP实现机器上是不一样的,比如有些是48秒就直接认为连接超时,有些是75秒之后,才连接超时

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值