linux中TCP Fast Open测试例子

httping是一个模拟ping输出的http请求客户端。从1.5开始支持发送fastopen请求,目前版本是2.3.4。

我在 fedora 20 (内核3.13版) 上编译了 nginx 1.5.13,yum 安装了 httping 2.3.3版。

开两个终端,一个运行tcpdump,然后另一个运行httping如下:

httping -F -g http://www.google.com.hk/url -c 1
这时候看到前一个终端的输出是这样的:

[chenlin.rao@com21-100 tfo]$ sudo tcpdump -i p5p1 -vvnxXs 0 tcp port 80 tcpdump: listening on p5p1, link-type EN10MB (Ethernet), capture size 65535 bytes 20:40:15.034486 IP (tos 0x0, ttl 64, id 52862, offset 0, flags [DF], proto TCP (6), length 147) 10.2.5.100.40699 > 74.125.128.199.http: Flags [S], cksum 0xbb34 (correct), seq 3616187260:3616187335, win 29200, options [mss 1460,sackOK,TS val 31091970 ecr 0,nop,wscale 7,exp-tfo cookie 9a8e5a15f1deab96], length 75 0x0000: 4500 0093 ce7e 4000 4006 913c 0a02 0564 E….~@.@..<…d 0x0010: 4a7d 80c7 9efb 0050 d78a a37c 0000 0000 J}…..P…|…. 0x0020: d002 7210 bb34 0000 0204 05b4 0402 080a ..r..4………. 0x0030: 01da 6d02 0000 0000 0103 0307 fe0c f989 ..m…………. 0x0040: 9a8e 5a15 f1de ab96 4845 4144 202f 7572 ..Z…..HEAD./ur 0x0050: 6c20 4854 5450 2f31 2e30 0d0a 486f 7374 l.HTTP/1.0..Host 0x0060: 3a20 7777 772e 676f 6f67 6c65 2e63 6f6d :.www.google.com 0x0070: 2e68 6b0d 0a55 7365 722d 4167 656e 743a .hk..User-Agent: 0x0080: 2048 5454 5069 6e67 2076 322e 332e 330d .HTTPing.v2.3.3. 0x0090: 0a0d 0a … 20:40:15.295644 IP (tos 0x0, ttl 30, id 42640, offset 0, flags [none], proto TCP (6), length 52) 74.125.128.199.http > 10.2.5.100.40699: Flags [S.], cksum 0x71c1 (correct), seq 1878126810, ack 3616187261, win 42900, options [mss 1430,nop,nop,sackOK,nop,wscale 6], length 0 0x0000: 4500 0034 a690 0000 1e06 1b8a 4a7d 80c7 E..4……..J}.. 0x0010: 0a02 0564 0050 9efb 6ff1 f0da d78a a37d …d.P..o……} 0x0020: 8012 a794 71c1 0000 0204 0596 0101 0402 ….q……….. 0x0030: 0103 0306 …. 20:40:15.295694 IP (tos 0x0, ttl 64, id 52863, offset 0, flags [DF], proto TCP (6), length 115) 10.2.5.100.40699 > 74.125.128.199.http: Flags [P.], cksum 0x5bf7 (correct), seq 1:76, ack 1, win 229, length 75 0x0000: 4500 0073 ce7f 4000 4006 915b 0a02 0564 E..s..@.@..[…d 0x0010: 4a7d 80c7 9efb 0050 d78a a37d 6ff1 f0db J}…..P…}o… 0x0020: 5018 00e5 5bf7 0000 4845 4144 202f 7572 P…[…HEAD./ur 0x0030: 6c20 4854 5450 2f31 2e30 0d0a 486f 7374 l.HTTP/1.0..Host 0x0040: 3a20 7777 772e 676f 6f67 6c65 2e63 6f6d :.www.google.com 0x0050: 2e68 6b0d 0a55 7365 722d 4167 656e 743a .hk..User-Agent: 0x0060: 2048 5454 5069 6e67 2076 322e 332e 330d .HTTPing.v2.3.3. 0x0070: 0a0d 0a … 20:40:15.560807 IP (tos 0x0, ttl 30, id 42641, offset 0, flags [none], proto TCP (6), length 40) 74.125.128.199.http > 10.2.5.100.40699: Flags [.], cksum 0x5720 (correct), seq 1, ack 76, win 670, length 0 0x0000: 4500 0028 a691 0000 1e06 1b95 4a7d 80c7 E..(……..J}.. 0x0010: 0a02 0564 0050 9efb 6ff1 f0db d78a a3c8 …d.P..o……. 0x0020: 5010 029e 5720 0000 0000 0000 0000 P…W……… 20:40:15.568068 IP (tos 0x0, ttl 30, id 42642, offset 0, flags [none], proto TCP (6), length 269) 74.125.128.199.http > 10.2.5.100.40699: Flags [P.], cksum 0x85ae (correct), seq 1:230, ack 76, win 670, length 229 0x0000: 4500 010d a692 0000 1e06 1aaf 4a7d 80c7 E………..J}.. 0x0010: 0a02 0564 0050 9efb 6ff1 f0db d78a a3c8 …d.P..o……. 0x0020: 5018 029e 85ae 0000 4854 5450 2f31 2e30 P…….HTTP/1.0 0x0030: 2034 3034 204e 6f74 2046 6f75 6e64 0d0a .404.Not.Found.. 0x0040: 436f 6e74 656e 742d 5479 7065 3a20 7465 Content-Type:.te 0x0050: 7874 2f68 746d 6c3b 2063 6861 7273 6574 xt/html;.charset 0x0060: 3d55 5446 2d38 0d0a 4461 7465 3a20 5765 =UTF-8..Date:.We 0x0070: 642c 2031 3620 4170 7220 3230 3134 2031 d,.16.Apr.2014.1 0x0080: 323a 3430 3a31 3520 474d 540d 0a53 6572 2:40:15.GMT..Ser 0x0090: 7665 723a 2067 7773 0d0a 436f 6e74 656e ver:.gws..Conten 0x00a0: 742d 4c65 6e67 7468 3a20 3134 3238 0d0a t-Length:.1428.. 0x00b0: 582d 5853 532d 5072 6f74 6563 7469 6f6e X-XSS-Protection 0x00c0: 3a20 313b 206d 6f64 653d 626c 6f63 6b0d :.1;.mode=block. 0x00d0: 0a58 2d46 7261 6d65 2d4f 7074 696f 6e73 .X-Frame-Options 0x00e0: 3a20 5341 4d45 4f52 4947 494e 0d0a 416c :.SAMEORIGIN..Al 0x00f0: 7465 726e 6174 652d 5072 6f74 6f63 6f6c ternate-Protocol 0x0100: 3a20 3830 3a71 7569 630d 0a0d 0a :.80:quic….
没错,在第一个 SYN 包的时候就把 HEAD 请求带过去了。

但是发现比较奇怪的是很多时候一模一样的命令,SYN 包上就没带数据。

按我的想法,既然还是第一个 SYN 包,客户端这边压根不知道服务器端的情况,那么应该不管服务器端如何 SYN 里都带有 HEAD 请求啊?

另外,用 httping -F 命令测试自己编译的 nginx 的时候,一直都没看到正确的抓包结果,HEAD 请求一直都是在三次握手后发送的。

试图用 systemtap 来追踪一些问题。

第一步确认我的 nginx 的 socket 是不是真的开了 fastopen:

一个终端运行如下命令:

stap -e 'probe kernel.function("do_tcp_setsockopt") {printf("%dn", $optname)}'
另一个终端启动nginx,看到前一个终端输出结果为23,查 tcp.h 可以看到 23 正是 TCP_FASTOPEN 没错!

第二步确认 httping 发送的时候是不是开了 fastopen:

一个终端运行如下命令:

stap -e 'probe kernel.function("tcp_sendmsg") {printf("%d %xn",$msg->msg_namelen,$msg->msg_flags)}'
另一个终端运行最开始提到的 httping -F 命令,看到前一个终端输出结果为 16 20000040,查 tcp.h 可以看到 MSG_FASTOPEN 是 0x20000000,MSG_DONTWAIT 是 0x40,也就是说 httping 也没问题。

现在比较郁闷的一点是:在 net/ipv4/tcp.c 里,tcp_sendmsg() 函数会判断 if ((flags & MSG_FASTOPEN)),就调用 tcp_sendmsg_fastopen() 函数来处理。但是试图用 systemtap 来调查这个函数的时候,会报一个错:

WARNING: probe kernel.function("tcp_sendmsg_fastopen@net/ipv4/tcp.c:1005") (address 0xffffffff815cca08) registration error (rc -22)
原因还未知。

留记,继续研究。

注1:发现 chrome 即使在 about:flags 里启用了 fastopen 好像也不行,必须命令行 google-chrome --enable-tcp-fastopen 这样打开才行。

注2:网上看到有人写server和client的demo演示fastopen,但其实不对,demo代码里print的数据是正常三次握手以后socket收到的。这点开tcpdump才能确认到底是什么时候发送的数据

时间: 2024-09-29 21:17:09

linux中TCP Fast Open测试例子的相关文章

教你使用vsftpd架设Linux中的FTP:测试

教你使用vsftpd架设Linux中的FTP:测试 配置安装完成之后,现在我们需要对vsftpd进行测试一下,看是否正常! 打开防火墙的21端口 [root@centos tmp]# vi /etc/sysconfig/iptables 添加如下规则: -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT 重启防火墙应用新规则 [root@centos tmp]# service iptables restartiptables:清除防火墙规则:&http://

linux中ssh公钥认证配置例子

在两台linux主机上由于环境的需要,经常要配置两台主机之间免密码登录,这就要用到key认证,也就是所谓的公私钥认证.便于理解,我这里指定两台主机为 A 和 B .如果A主机想免密码登录到B主机上,则A主机上存放私钥,B 主机上存放公钥.通过ssh-keygen 命令生成的两个文件为:公钥文件 ~/.ssh/id_rsa.pub: 私钥文件 ~/.ssh/id_rsa .而B主机上存放公钥时,需要将id_rsa.pub的内容存放到~/.ssh/authorized_keys 文件内,并且保证权限

在Linux中使用unixbench来测试测试系统性能

  unixbench是什么? unixbench是一套unix系统基准测试套件.unixbench的设计目标是为类unix系统提供一套基本的指标,所以有许多项目测试系统各方面的性能.各项的测试有得分,然后有一个综合的得分,这样可以很方便的通过分数去比较. unixbench也包含一些非常简单的2D和3D图形测试. unixbench也支持多CPU系统的测试,默认的行为是测试两次,第一次是一个进程的测试,第二次是N份测试,N等于CPU个数.这样的设计是为了以下目标: 测试系统的单任务性能 测试系

linux中KVM 虚拟机增加硬盘例子

方法一.常规方式 采用模板的方式可能导致虚拟机的硬盘容量不够,可以通过单独增加一块硬盘来作为数据的存储. 1.首先使用dd命令在默认路径下创建一个大小为10G的映像文件: dd bs=1M count=10240 if=/dev/zero of=/var/lib/libvirt/images/guest1_data.img 另外也可以使用 qemu-img 命令来创建,具体可以参考:centos 6.6 安装 KVM 虚拟机. 2.使用virsh edit 命令来编辑 domain 的配置文件,

linux中查找php木马程序例子

1.服务器本身的安全 安装denyhost,防止SSH的暴力破解,具体安装方法参考<denyhost防止SSH暴力破解,保护你的linux>一文. 另外对系统的一些重要文件添加一个i权限 比如:  代码如下 复制代码 # chattr +i /etc/passwd # chattr +i /etc/group # chattr +i /etc/shadow # chattr +i /etc/gshadow # chattr +i /etc/ssh/sshd_config 2.nginx和php

linux中挂载数据盘的例子

  最近给Linux服务器升级了,原因在于之前的配置太低了,以至于数据库无法访问.一升级之后,发现分配了一个50G的数据盘,而且需要自己挂载在系统上,所以只好找资料来挂载数据库,并且把网站数据转移到此数据盘上.步骤如下:   说明:   1. 适用系统:Linux(Redhat , CentOS,Debian,Ubuntu)   2. Linux的云服务器数据盘未做分区和格式化   1.查看数据盘   在没有分区和格式化数据盘之前,使用 "df –h"命令,是无法看到数据盘的,可以使用

Linux中imagemagick图片批量压缩例子

 代码如下 复制代码 sudo apt-get install imagemagick       其它linux有对应的软件安装命令,以下有我写的两个脚本,分别对图片进行批量格式以及压缩操作:     图片格式转换,这里的示例是将[bB][mM][pP](所有BMP文件)格式的文件,转换为占空间小的jpg文件:  代码如下 复制代码 #!/bin/sh for img in `find ./ -name "*.[bB][mM][pP]"`; do         #change up

linux中openshift搭建与使用例子

本篇所在总结的内容本来是一个过时的东西,不过由于当下红帽考试仍使用的这个旧的版本,这里还是简单总结下openshift2.x的配置和使用.openshift是红帽的paas 应用,想要和cloudfoundry之类的paas类产品竞争,不过从当前市场占用份额上来看,cloudfoundry处于行业主宰者,龙头地位.openshit2.x是基于红帽自己搞的gear技术---可以看做是类似沙箱的一种技术,和docker一样也是基于lxc基础上做的封装.当前openshitf3.x 版本较opensh

linux中RH236 glusterfs存储配置的例子

主机规划   其中前四个节点为配置glusterfs 分布式.复制.分布+复制.Geo异地同步等.其中前四个节点用于几种类型存储配置,第五台主机用作client访问.和Geo异常容灾模拟.需要注意的是,如下所有的配置中,我使用的都是IP,现网中建议使用主机名或域名的方式配置,这个IP发生变更时,无需在glusterfs中进行修改,只在dns中修改下指向IP即可.   主机名 IP地址 node1 server2-a.example.com 172.25.2.10 node2 server2-b.