Tcp抓包以及tcp状态解释

转自:http://www.aichengxu.com/view/47568linux

Tcp抓包以及tcp状态解释,有须要的朋友能够参考下。ios

 

  • tcp三次握手

 

发送端发送一个SYN=1,ACK=0标志的数据包给接收端,请求进行链接,这是第一次握手;接收端收到请求而且容许链接的话,就会发送一个SYN=1,ACK=1标志的数据包给发送端,告诉它,能够通信了,而且让发送端发送一个确认数据包,这是第二次握手;最后,发送端发送一个SYN=0,ACK=1的数据包给接收端,告诉它链接已被确认,这就是第三次握手。以后,一个TCP链接创建,开始通信。

服务器



  • tcp链接状态

 

SYN:同步标志。同步序列编号(Synchronize Sequence Numbers)栏有效。该标志仅在三次握手创建TCP链接时有效。它提示TCP链接的服务端检查序列编号,该序列编号为TCP链接初始端(通常是客户端)的初始序列编号。在这里,能够把 TCP序列编号看做是一个范围从0到4,294,967,295的32位计数器。经过TCP链接交换的数据中每个字节都通过序列编号。在TCP报头中的序列编号栏包括了TCP分段中第一个字节的序列编号。网络

 



ACK:确认标志。确认编号(Acknowledgement Number)栏有效。大多数状况下该标志位是置位的。TCP报头内的确认编号栏内包含的确认编号(w+1,Figure-1)为下一个预期的序列编号,同时提示远端系统已经成功接收全部数据。



RST:复位标志。复位标志有效。用于复位相应的TCP链接。



URG:紧急标志。紧急(The urgent pointer) 标志有效。紧急标志置位,



PSH:推标志。该标志置位时,接收端不将该数据进行队列处理,而是尽量快将数据转由应用处理。在处理 telnet 或 rlogin 等交互模式的链接时,该标志老是置位的。



FIN:结束标志。带有该标志置位的数据包用来结束一个TCP回话,但对应端口仍处于开放状态,准备接收后续数据。less



.TCP的几个状态对于咱们分析所起的做用。在TCP层,有个FLAGS字段,这个字段有如下几个标识:SYN, FIN, ACK, PSH, RST, URG.其中,对于咱们平常的分析有用的就是前面的五个字段。它们的含义是:tcp



  1. SYN表示创建链接
  2. FIN表示关闭链接
  3. ACK表示响应
  4. PSH表示有 DATA数据传输
  5. RST表示链接重置

 

其中,ACK是可能与SYN,FIN等同时使用的,好比SYN和ACK可能同时为1,它表示的就是创建链接以后的响应,若是只是单个的一个SYN,它表示的只是创建链接。TCP的几回握手就是经过这样的ACK表现出来的。但SYN与FIN是不会同时为1的,由于前者表示的是创建链接,然后者表示的是断开链接。RST通常是在FIN以后才会出现为1的状况,表示的是链接重置。通常地,当出现FIN包或RST包时,咱们便认为客户端与服务器端断开了链接;而当出现SYN和SYN+ACK包时,咱们认为客户端与服务器创建了一个链接。PSH为1的状况,通常只出如今 
DATA内容不为0的包中,也就是说PSH为1表示的是有真正的TCP数据包内容被传递。TCP的链接创建和链接关闭,都是经过请求-响应的模式完成的。 



工具



  • tcp常见错误状态



  1. Tcp previous segment lost(tcp先前的分片丢失)
  2. Tcpacked lost segment(tcp应答丢失)
  3. Tcp window update(tcp窗口更新)
  4. Tcp dup ack(tcp重复应答)
  5. Tcp keep alive(tcp保持活动)
  6. Tcp retransmission(tcp重传)
  7. Tcp ACKed unseen segument (tcp看不见确认应答)
  8. tcp port numbers reused(tcp端口重复使用)
  9. tcp retransmission(tcp重传)
  10. tcp fast retransmission (tcp快速重传)
  11. TCP Previoussegment lost(发送方数据段丢失)
  12. tcp spurious retransmission(tcp伪重传)



  • tcp抓包工具tcpdump和wireshark

 

在linux下tcpdump是一个很强大的tcp抓包工具,可是因为linux分析不方便,所以能够将抓包数据保存到.cap文件中,而后在windos下使用wireshark进行分析,很是方便。

spa



  • tcpdump抓包命令

 

 

tcpdump tcp -i eth2 -s 0 and port 20058  -w /home/pjroot/attence.cap
tcpdump tcp -i eth2 -t -s 0 -c 100 and port 20058  -w /home/pjroot/attence.cap
tcpdump tcp -i eth2 -s 0 and port 20058 and host 125.77.252.211 -w ./attence.cap

 

 

-i eth2 指定数据包通过的网卡code

 

-s 0 抓取数据包时默认抓取长度为68字节。加上-S 0 后能够抓到完整的数据包

blog

 

port 指定端口 能够加上src 和dst表示如今为源端口仍是目的端口

 

host 指定主机能够加上src和dst表示源地址仍是目的地址

 

-w 表示要写入到文件中

 

-t 表示不显示时间戳

 

-c 100 表示只抓取初始的100个数据包

 

 

 

打印全部进入或离开sundown的数据包.

 


tcpdump host sundown

 

也能够指定ip,例如截获全部210.27.48.1的主机收到的和发出的全部的数据包

 


tcpdump host 210.27.48.1

 

打印helios 与 hot 或者与 ace 之间通讯的数据包

 


tcpdump host helios and \( hot or ace \)

 

截获主机210.27.48.1和主机210.27.48.2或210.27.48.3的通讯

 


tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \)

 

打印ace与任何其余主机之间通讯的IP 数据包, 但不包括与helios之间的数据包.

 


tcpdump ip host ace and not helios

 

若是想要获取主机210.27.48.1除了和主机210.27.48.2以外全部主机通讯的ip包,使用命令:

 


tcpdump ip host 210.27.48.1 and ! 210.27.48.2

 

截获主机hostname发送的全部数据

 


tcpdump -i eth0 src host hostname

 

监视全部送到主机hostname的数据包

 


tcpdump -i eth0 dst host hostname

 

若是想要获取主机210.27.48.1接收或发出的telnet包,使用以下命令

 


tcpdump tcp port 23 and host 210.27.48.1

 


tcpdump  -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854

 

0x4745 为"GET"前两个字母"GE",0x4854 为"HTTP"前两个字母"HT"。



  • tcpudp命令参数说明

 

-i any : 监听全部接口-n : 不解析主机名-nn : 不解析主机名和端口名-X : 以16进制和ascii格式显示包-XX : 和-X同样,但会显示以太网头-v, -vv, -vvv : 获取包含信息量更多的包-c : 获取指定数量的包,达到该数量后tcpdump中止-S : 显示绝对序列号-e : 获取以太网头-q : 显示少许的协议信息-E : 经过密钥来解密IPSEC交互-s : 设置snaplength(snaplength是抓取的字节数)- host // 根据ip地址查询交互(不用"-n"也能根据主机名查询交互)# tcpdump host 1.2.3.4- src,dst // 找出指定源地址或目的地址的交互# tcpdump src 2.3.4.5# tcpdump dst 3.4.5.6- net // 根据网络号抓取整个网络# tcpdump net 1.2.3.0/24- proto // 工做在tcp,udp,和icmp。注意你不用必须输入proto。# tcpdump icmp- port // 查看通过指定端口的交互# tcpdump port 3389- src,dst port // 找出指定源端口或目的端口的交互# tcpdump src port 1025# tcpdump dst port 389- src/dst, port, protocol // 将三个联合在一块儿# tcpdump src port 1025 and tcp# tcpdump udp and src port 53你也能够用选项来找出多个端口而不用一一指定,也能够仅查看大于或小于某一字节大小的包。- Port Ranges // 查看通过范围内端口的交互tcpdump portrange 21-23- Packet Size Filter // 查看大于或小于某一字节大小的包tcpdump less 32tcpdump greater 128也能够用符号来代替tcpdump > 32tcpdump <= 128写到一个文件tcpdump用"-w"选项能够将抓到的内容存入文件,再用"-r"选项读回来,这个功能很是好,能够抓取原始交互以后再用其余工具运行它。以这种方式抓取到的交互会存成tcpdump格式的文件,如今网络分析圈内基本都用这种格式,所以文件能够被全部工具读取,包括Wireshark, Snort等。- 抓取全部通过端口80的交互存入一个文件# tcpdump -s 1514 port 80 -w capture_file- 之后能够再读回来# tcpdump -r capture_file更多的例子# 从10.5.2.3到端口3389的tcp交互tcpdump -nnvvS and src 10.5.2.3 and dst port 3389# 从网络192.168到网络10或172.16的交互tcpdump -nvX src net 192.168.0.0/16 and dst net 10.0.0.0/8 or 172.16.0.0/16# 从192.168.0.2到网络172.16的非icmp交互tcpdump -nvvXSs 1514 dst 192.168.0.2 and src net and not icmp# 从Mars或Pluto到非SSH端口的交互tcpdump -vv src Mars or Pluto and not dst port 22分组若是你试图运行这个原本很是有用的命令,由于括号的缘由会报错,能够对括号进行转义(前面加"/")或者将整个命令放在单引号中:# 从10.0.2.4到端口3389或22的交互(正确的表达)tcpdump 'src 10.0.2.4 and (dst port 3389 or 22)'

相关文章
相关标签/搜索