转载请在文首保留原文出处:EMC中文支持论坛https://community.emc.com/go/chinese
 
介绍
 
前文论述了TCP基础知识,从本节开始,通过TCP抓包实例来诊断TCP常见问题。
TCP进程通讯时,双方打开连接,发送数据,最后关闭连接。当TCP打开连接时,从源端口到目的端口发送一个请求。在应用建立或关闭时可能发生一些问题。本文讨论用Wireshark网络抓包的方法来定位及解决这一问题。

更多信息
 
问题的表现形式:
 
问题可能有多种表现类型:
· 尝试运行应用程序但发现应用程序无法工作。尝试浏览网络但无法获得响应。
· 尝试发送邮件但无法连接到邮件服务器。
· 问题可能由简单原因引起,如服务器宕机,服务器上没有运行应用程序,或在客户端到服务器的某一处网络断开。
· 问题也可能由复杂原因引起,如DNS问题,服务器内存不足无法连接(例如某一应用占用高内存空间),重复IP,以及其他原因。

处理方法:

下文会介绍解决问题的线索以及如何通过抓包来诊断TCP连接问题。通常,这些问题会导致运行应用程序时无法得到任何结果。

当你在运行一个应用程序时,例如数据库客户端,邮件客户端,观看视频等等,而又无法获得输出,按照以下步骤诊断:
   确认服务器和应用程序正在运行。
   确认客户端正在运行,IP地址已配置(手动或通过DHCP),并连接至网络。
  Ping服务器并确认连接正常。
  在某些情况下,ping不通服务器但连接正常。这是由于防火墙拦截了ICMP信息,所以如果无法ping通并不一定表示连接有问题。防火墙可能是网络中的专用设备或Windows/Linux/UNIX终端设备上安装的防火墙。

5. 抓包文件中,查找以下模式:
· 三重SYN信息而没有响应(见以下截屏)
· SYN信息带一个reset(RST)响应
这两种情况下都有可能是防火墙拦截了特定应用程序或应用程序没有在运行。
 
以下截屏是一个简单的case:客户端无法连接到web服务器81.218.31.171(报文61,62和63)。可能是由于不被防火墙允许,或服务器发生故障。可以看到另一个站点108.160.163.43(报文65,66和67)的连接正常,因此连接问题仅限于81.218.31.171。

 

下例是一个这种情况相对复杂的case。该case中,客户想
要登录到camera服务器来访问远程站点的camera。camera服务器的IP地址为135.82.12.1,问题在于客户能够看到服务器主页上的登录窗口,但无法登进系统。在下面的截图中可以看到,打开了一个到IP地址135.82.12.1的连接。到HTTP服务器的TCP连接是打开的,一开始看上去没有连接问题:

 

当我们过滤出目的IP地址为135.82.12.1的数据流,也就是camera服务器。这里可以看到,当尝试连接TCP端口6036时,得到了一个RST/ACK响应,有以下可能性:
· 防火墙拦截了端口6036
· 如果配置了端口地址转换(PAT),那么仅转换端口80而非6036
· 用户名和密码验证是在TCP端口6036上完成的,防火墙仅允许端口80,验证被拦截,应用无法工作

 

总之,当无法正常连接服务器时,检查服务器和客户端是否所有TCP/UDP端口都能通过网络转发,以及是否有未知的端口。
 
 
工作过程:
 
TCP连接开始时,发生了以下三步:

 

1. 客户端TCP进程发送了一个SYN报文。该报文中SYN标志位设置为1。这一报文中客户端:
· 指定自己的初始序列号。这是客户端发送给服务器的第一个字节。
· 指明自己的窗口大小。这是客户端分配给进程的缓存大小(位于客户端的RAM)。
· 设置自己将要使用的选项:MSS,Selective ACK,等等。
 
2. 当服务器收到建立连接请求,服务器:
· 发送SYN/ACK给客户端,确认接收到SYN请求。
· 指明服务器端的初始序列号。这是服务器发送给客户端的第一个字节。
· 指明服务器的窗口大小。这是服务器分配给进程的缓存大小(位于服务器RAM)。
· 回复请求选项并设置服务器端选项。
 
3. 当接收到服务器的SYN/ACK,客户端:
· 发送ACK报文给服务器,确认从服务器接收到SYN/ACK.
· 指明客户端窗口大小。尽管这一参数在第一个报文中定义过了,服务器还是会参考这个值,因为这是最新的窗口大小。
      
       在TCP头部的选项字段中,有以下几个主要选项:
 
· Maximum Segment Size(MSS):TCP数据报的最大字节数,即从TCP头部开始直到报文末尾的字节数。
· Windows Scale Option (WSopt):这一因子与TCP头部的Window Size字段相乘,通知接收方扩大缓存。由于头部最大窗口大小是64KB,乘以因子4也就是256KB窗口大小。
· SACK:Selective ACK,该选项使连接双方能够仅确认指定报文,当单个报文丢失,只有这个报文会被重传。连接建立时,双方都需要同意SACK。
· Timestamps Option(TSopt):该参数指客户端和服务器之间的延时。

在这一阶段,双方:
 
· 同意建立连接
· 知道对方的初始序列号
· 知道对方的窗口大小

在建立连接时,除了三路握手信号之外,其他都表示有问题。包括SYN没有响应,SYN之后SYN/ACK最后没有ACK,SYN响应为RST,等等。

总结:
 
· 如果SYN报文收到回复RST,则检查拦截了port号的防火墙。
· 三次SYN而没有任何回复,或者是由于应用程序没有响应,或者是由于防火墙拦截了特定端口上的请求。
· 永远记住确认一下是否有NAT,端口转发,以及涉及TCP和UDP端口的机制。这些机制可能会中断TCP正常操作。
 
 
 
 
参考
 
Network Analysis Using Wireshark Cookbook

Wireshark抓包实例诊断TCP连接问题的更多相关文章

  1. Wireshark抓包实例分析TCP重复ACK与乱序

    转载请在文首保留原文出处: EMC 中文支持论坛https://community.emc.com/go/chinese 介绍 TCP 的一大常见问题在于重复 ACK 与快速重传.这一现象的发生也是由 ...

  2. FTP协议的粗浅学习--利用wireshark抓包分析相关tcp连接

    一.为什么写这个 昨天遇到个ftp相关的问题,关于ftp匿名访问的.花费了大量的脑细胞后,终于搞定了服务端的配置,现在客户端可以像下图一样,直接在浏览器输入url,即可直接访问. 期间不会弹出输入用户 ...

  3. wireshark抓包结果很多[TCP Retransmission]怎么办?

    有一同事问用wireshark抓包时发现很多[TCP Retransmission],这些包极大影响了自己真正想看的http数据包,如下图. 我拿到pcapng后首先看到这些包的来源ip都是固定的两个 ...

  4. Wireshark抓包介绍和TCP三次握手分析

    wireshark介绍 wireshark的官方下载网站: http://www.wireshark.org/ wireshark是非常流行的网络封包分析软件,功能十分强大.可以截取各种网络封包,显示 ...

  5. wireshark抓包直观图解 TCP三次握手/四次挥手详解

    转http://www.seanyxie.com/category/linux/ 作者:seanyxie |   一. TCP/IP协议族 TCP/IP是一个协议族,通常分不同层次进行开发,每个层次负 ...

  6. 利用tcpdump抓包工具监控TCP连接的三次握手和断开连接的四次挥手

    TCP传输控制协议是面向连接的可靠的传输层协议,在进行数据传输之前,需要在传输数据的两端(客户端和服务器端)创建一个连接,这个连接由一对插口地址唯一标识,即是在IP报文首部的源IP地址.目的IP地址, ...

  7. 网络基本功(二十七):Wireshark抓包实例分析HTTP问题

    转载请在文首保留原文出处:EMC中文支持论坛https://community.emc.com/go/chinese 介绍 HTTP的问题可能是由于慢速服务器或客户端,TCP性能问题,本文讨论上述问题 ...

  8. wireshark 抓包再利用TCP socket发送包里的payload是可以实现登陆的

    用户密码可被批量破解 在用户使用手机端登录时,对数据进行抓包分析. 多次抓包分析后,可得到几个关键TCP数据包. 根据前面逆向编写出的解密算法,使用socket进行数据发包测试: 可以模拟APK进行用 ...

  9. WireShark抓包时TCP数据包出现may be caused by ip checksum offload

    最近用WireShark抓包时发现TCP数据包有报错:IP Checksum Offload,经过查阅资料终于找到了原因 总结下来就是wireshark抓到的数据包提示Checksum错误,是因为它截 ...

随机推荐

  1. Newtonsoft.Json 高级用法

    基本用法 Json.NET是支持序列化和反序列化DataTable,DataSet,Entity Framework和Entity的.下面分别举例说明序列化和反序列化. DataTable: //序列 ...

  2. 常见内网IP段

    以下IP段为内网IP段: 192.168.0.0 - 192.168.255.255 172.16.0.0 - 172.31.255.255 10.0.0.0 - 10.255.255.255

  3. root用户无法通过ssh连接Linux系统

    ssh协议为了安全,有些版本默认禁止root用户的登陆 cd /etc/ssh 编辑sshd_config文件 cat sshd_config | grep PermitRootLogin Permi ...

  4. JavaSE| 泛型

    泛型 泛型:对后续所有操作的类型做约束,对后续操作起作用,对之前的不起作用: 对类型进行约束:  父 ----> 子,从范围上,父范围小,子范围大:把范围小的给范围大的, JDK1.5改写了集合 ...

  5. 无法启动 Maya 集成的 qt designer 的解决方法和原因 以及 中英文切换

    无法启动 Maya 集成的 qt designer 的解决方法和原因 以及 中英文切换 前言: Maya 集成了 PySide,同时集成了qt designer,在 Maya 的安装目录下的 bin ...

  6. POJ 1330 Nearest Common Ancestors (模板题)【LCA】

    <题目链接> 题目大意: 给出一棵树,问任意两个点的最近公共祖先的编号. 解题分析:LCA模板题,下面用的是树上倍增求解. #include <iostream> #inclu ...

  7. 对Promise的一些深入了解

    1.介绍promise和模仿Promise.all和Promise.race promise的设计主要是解决回调地狱(接收结果用回调函数来处理,但必须传入回调函数)的问题,由一层层嵌套回调函数改为由t ...

  8. EF Core使用CodeFirst在MySql中创建新数据库以及已有的Mysql数据库如何使用DB First生成域模型

    官方教程:https://docs.microsoft.com/en-us/aspnet/core/data/?view=aspnetcore-2.1 使用EF CodeFirst在MySql中创建新 ...

  9. Jenkins不同job之间传递参数

    有的时候不同job直接需要传递一个文件名或者路径,这个时候我们不需要传递文件实体,那这个路径如何传递呢?比如有如下两个项目,我想把A的工作目录传递给B,让B使用. A job配置 首先需要安装一个Pa ...

  10. 按字典序依次打印只由1~n组成的n位数

    //我的dfs入门.将1~n一次填入数组然后打印. #include<stdio.h> #include<string.h> ]; ]; void dfs(int,int); ...