用Wireshark分析Socket连接建立的过程
0. 安装Wireshark,但是默认情况下,Wireshark无法捕获127.0.0.1的报文
解决方案:安装npcap,替换默认的winpacp,重新启动Wireshark,就可以看到一个名字中含有Loopback的接口,针对它来抓包就行了
1. 用telnet向未被监听的9090端口发送连接请求
telnet窗口一闪而过,抓包结果如下

可以看出,未被监听的端口会直接返回RST包,导致Telnet无法正常建立连接。
2. 开启echo server监听9090端口,然后使用telent向9090端口发送连接请求

可以清楚的看到TCP的三次握手过程,现在Telnet已经与echo server建立了TCP连接了
3. 在第二步的基础上,使用telenet向echo server发送数据
我在Telnet里输入了abc三个字符,下图是抓包结果

可以看到一共有12个包,每四个包为一组,对应于Telnet中的一次输入
这四个包分别对应于 客户端发送字符->服务器ack->服务器发送echo->客户端ack
4. 在BIO模式的echo server中插入断点
使用BIO模式的echo server,但是在调用ServerSocket.accept()方法处下断点,让程序跑到此处停顿。
然后启动Telnet向服务器发送数据,结果如下:

可以看到在这种情况下,居然可以完成三次握手协议,正常建立连接(但此时服务端正卡在accept()方法上)
对于客户端后续发送的数据,服务端也能及时发送ack,只是无法发送echo罢了。一旦放开echo server的断点,服务器就能正常工作了,前面没收到echo的数据也不会丢失。
5. 在NIO模式的echo server中插入断点
与BIO模式相近,ServerSocketChannel只要与端口绑定,对于Telnet的连接请求,无需服务端调用accept方法就能完成三次握手。
客户端后续发送的数据,服务端也能正常返回ack。
6. 为什么只需要完成监听端口,无需调用accept方法就能完成三次握手呢?
我之前的想法是:accept方法在收到客户端发过来的syn包后就会从阻塞状态中退出,在此同时返回ack+syn包,完成三次握手(这个想法太奇怪了)
实际上是tcp底层维护了两个队列:半连接队列与全连接队列。操作系统收到Telnet的tcp连接请求后会自动完成三次握手建立TCP连接,然后将这个连接放到全连接队列中。而accept方法则是将TCP连接从这个全连接队列中提取出来罢了。
简单测试一下,在创建ServerSocket对象的时候,将backlog设置为1,然后将断点设置在accept方法处(不让程序从TCP全连接队列中提取连接)。然后开启两个Telnet客户端,结果第一个Telnet可以正常连接,第二个Telnet直接闪退了。
抓包如下图所示:

可以清楚的看到从6078到9090的TCP连接成功的完成了三次握手,从6079到9090的TCP连接则握手失败了。
参考资料:
用Wireshark分析Socket连接建立的过程的更多相关文章
- 第三次实验报告:使用Packet Tracer分析TCP连接建立过程
目录 1 实验目的 2 实验内容 3. 实验报告 3.1 建立网络拓扑结构 3.2 配置参数 3.3 抓包,分析TCP连接建立过程 4. 拓展 (不作要求,但属于加分项) 1 实验目的 使用路由器连接 ...
- wireshark分析dhcp过程
---恢复内容开始--- DHCP DHCP(Dynamic Host Configuration Protocol)是一个用于主机动态获取IP地址的配置解 析,使用UDP报文传送,端口号为67何68 ...
- [转]使用wireshark分析TCP/IP协议中TCP包头的格式
本文简单介绍了TCP面向连接理论知识,详细讲述了TCP报文各个字段含义,并从Wireshark俘获分组中选取TCP连接建立相关报文段进行分析. 一.概述 TCP是面向连接的可靠传输协议,两个进程互发数 ...
- Linux网络编程--wireshark分析TCP包头的格式
摘要: 本文简介了TCP面向连接理论知识,具体讲述了TCP报文各个字段含义.并从Wireshark俘获分组中选取TCP连接建立相关报文段进行分析. 一.概述 TCP是面向连接的可靠传输 ...
- Wireshark分析非标准端口号流量
Wireshark分析非标准端口号流量 2.2.2 分析非标准端口号流量Wireshark分析非标准端口号流量 应用程序运行使用非标准端口号总是网络分析专家最关注的.关注该应用程序是否有意涉及使用非 ...
- Linux第三周——跟踪分析内核的启动过程
跟踪分析内核的启动过程实验 张潇月<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 这周主要学习的是对内核 ...
- MyBatis 源码分析 - SQL 的执行过程
* 本文速览 本篇文章较为详细的介绍了 MyBatis 执行 SQL 的过程.该过程本身比较复杂,牵涉到的技术点比较多.包括但不限于 Mapper 接口代理类的生成.接口方法的解析.SQL 语句的解析 ...
- MyBatis 源码分析 - 映射文件解析过程
1.简介 在上一篇文章中,我详细分析了 MyBatis 配置文件的解析过程.由于上一篇文章的篇幅比较大,加之映射文件解析过程也比较复杂的原因.所以我将映射文件解析过程的分析内容从上一篇文章中抽取出来, ...
- Linux使用tcpdump命令抓包并使用wireshark分析
Linux使用tcpdump命令抓包并使用wireshark分析 介绍 有时分析客户端和服务器网络交互的问题时,为了查找问题,需要分别在客户端和服务器上抓包,我们的客户端一般是windows上的,抓包 ...
随机推荐
- C语言中strtod()函数的用法详解
函数原型: #include <stdlib.h> double strtod(const char *nptr, char **endptr); C语言及C++中的重要函数. 名称含义 ...
- 牛课第二次多校I
链接:https://www.nowcoder.com/acm/contest/140/I来源:牛客网 题目描述 White Cloud has a square of n*n from (1,1) ...
- datagrid的增加功能的实现
一.增加 1.行编辑状态所需的条件 (1)在columns中添加editor,注意type的设置 (2)调用beginEdit方法,开启行编辑 添加到第一行: 添加到最后一行: (2)如果有一行开启了 ...
- 网络抢票黄牛,大部分是骗人的。公布一个骗钱黄牛,QQ:2233261390,QQ群:29443597,支付页面:https://me.alipay.com/q336
想着给女友买张回广州的回程火车票,抢了3天也没弄到.情急之下找了网络上所谓的黄牛.结果上当受骗.具体经过是这样的: 对方承诺抢到再付款.于是等他抢到后截图给我看,而且可以远程到他的机器去看,我也确实远 ...
- Spring Boot 学习系列(03)—jar or war,做出你的选择
此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 两种打包方式 采用Spring Boot框架来构建项目,我们对项目的打包有两种方式可供选择,一种仍保持原有的 ...
- couchbase map reduce
map function(){emit(null,2);} reduce function(key, values, rereduce){ var response = {"a": ...
- 【SCOI 2010】传送带
为了方便,我们不妨设$\rm P \lt Q,R$ 我们发现,有$\rm E$点在$\rm AB$上,$\rm F$点在$\rm CD$上,最优解一定是$\rm AE\rightarrow EF\ri ...
- Python学习-day10(番外篇) 阻塞IO 非阻塞IO 同步IO 异步IO
这个章节的内容是关于IO的概念,谈一谈什么是 阻塞IO 非阻塞IO 同步IO 异步IO.以下摘要是我对这四种IO的一个形象理解. 场景是去去银行办理业务.节点有三个,1)到银行提交申请:2)取号:3) ...
- CSU-1980 不堪重负的树
CSU-1980 不堪重负的树 Description 小X非常喜欢树,然后他生成了一个大森林给自己玩. 玩着玩着,小X陷入了沉思. 一棵树由N个节点组成,编号为i的节点有一个价值Wi. 假设从树根出 ...
- 【LeetCode】Search Insert Position(搜索插入位置)
这道题是LeetCode里的第35道题. 题目描述: 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置. 你可以假设数组中无重复元 ...