Java网络编程学习A轮_03_抓包分析TCP四次挥手
参考资料:
http://www.jellythink.com/archives/705
示例代码:
https://github.com/gordonklg/study,socket module
A. TCP 四次挥手
下图描述了 TCP 整个生命周期从建立连接到断开连接的逻辑:

下面的测试代码完美模拟了上图
gordon.study.socket.basic.wireshark.TcpLifecycle.java
public class TcpLifecycle {
@SuppressWarnings("resource")
public static void main(String[] args) throws Exception {
new Thread(new Runnable() {
@Override
public void run() {
try {
ServerSocket serverSocket = new ServerSocket(8888);
Socket socket = serverSocket.accept();
socket.getInputStream().read();
socket.close();
} catch (Exception e) {
}
}
}).start();
Socket socket = new Socket();
socket.connect(new InetSocketAddress(8888));
Thread.sleep(3000);
socket.getOutputStream().write('a');
socket.close();
}
}
WireShark 的截图如下,解释都是多余的。

B. Socket timeout
Java 中的 socket 超时只针对读操作。
gordon.study.socket.basic.wireshark.ClientSocketTimeout.java
public class ClientSocketTimeout {
@SuppressWarnings("resource")
public static void main(String[] args) throws Exception {
new Thread(new Runnable() {
@Override
public void run() {
try {
ServerSocket serverSocket = new ServerSocket(8888);
serverSocket.accept();
while (true) {
Thread.sleep(1000);
}
} catch (Exception e) {
}
}
}).start();
try (Socket socket = new Socket()) {
socket.connect(new InetSocketAddress(8888));
socket.setSoTimeout(1000);
socket.getInputStream().read();
}
}
}
由于第21行代码设置了 socket timeout,第22行代码中 read 方法最多阻塞1秒钟,如果无法从流中读取数据,则抛出 java.net.SocketTimeoutException。
抛出异常后,主线程退出,由于使用了 try-with-resource,退出前会关闭客户端 socket,但是服务端永远在睡大觉,不会关闭 socket,所以整个 TCP 连接并没有完全关闭。
从下边的 WireShark 截图可知,TCP四次挥手只走了一半(No.4 & No.5),服务端没有调用 close 方法,所以服务端处于 CLOSE_WAIT 状态,而客户端处于 FIN_WAIT_2 状态,下面的 CMD 截图可以证明。


而 120 秒后(WireShark截图 No.228),FIN_WAIT_2 状态的 55421 端口主动向 8888 端口发送 RST 重置请求,最终两个异常状态都消失了。这应该是操作系统层面做的。这部分没有搞明白,放到B轮再研究。
Java网络编程学习A轮_03_抓包分析TCP四次挥手的更多相关文章
- Java网络编程学习A轮_02_抓包分析TCP三次握手过程
参考资料: https://huoding.com/2013/11/21/299 https://hpbn.co/building-blocks-of-tcp/#three-way-handshake ...
- Java网络编程学习A轮_01_目标与基础复习
A. A轮目标 复习网络编程基础知识,重点学习下TCP三次握手四次挥手,以及可能引发的异常情况. 回顾 Socket 编程,好多年没写(chao)过相关代码了. 重学 NIO,以前学的基本忘光了,毕竟 ...
- 抓包分析 TCP 握手和挥手
前言 首先需要明确的是 TCP 是一个可靠传输协议,它的所有特点最终都是为了这个可靠传输服务.在网上看到过很多文章讲 TCP 连接的三次握手和断开连接的四次挥手,但是都太过于理论,看完感觉总是似懂非懂 ...
- Java网络编程学习A轮_08_NIO的Reactor模型
参考资料: 了解 Java NIO 的 Reactor 模型,大神 Doug Lea 的 PPT Scalable IO in Java 必看:http://gee.cs.oswego.edu/dl/ ...
- Java网络编程学习A轮_06_NIO入门
参考资料: 老外写的教程,很适合入门:http://tutorials.jenkov.com/java-nio/index.html 上面教程的译文:http://ifeve.com/overview ...
- Java网络编程学习A轮_07_基于Buffer的Socket编程
示例代码: https://github.com/gordonklg/study,socket module A. LineSeparate 基于 Buffer 实现逐行读取的 EchoServer ...
- Java网络编程学习A轮_05_Socket编程
示例代码: https://github.com/gordonklg/study,socket module A. Socket 编程简单例子 最简单的 Socket 编程是通过回车/换行符,整行读取 ...
- Java网络编程学习A轮_04_TCP连接异常
参考资料: https://huoding.com/2016/01/19/488 示例代码: https://github.com/gordonklg/study,socket module A. C ...
- 网络协议抓包分析——TCP传输控制协议(连接建立、释放)
前言 TCP协议为数据提供可靠的端到端的传输,处理数据的顺序和错误恢复,保证数据能够到达其应到达的地方.TCP协议是面向连接的,在两台主机使用TCP协议进行通信之前,会先建立一个TCP连接(三次握手) ...
随机推荐
- 字符串处理(String)
字符串类型(String类)需要注意的几个函数: 1.字符串的连接.一般而言,Java不允许运算符直接应用到String对象,唯一的例外是"+"运算符,它用来连接两个字符串,产生一 ...
- 转悠望南山 Python闲谈(二)聊聊最小二乘法以及leastsq函数
1 最小二乘法概述 自从开始做毕设以来,发现自己无时无刻不在接触最小二乘法.从求解线性透视图中的消失点,m元n次函数的拟合,包括后来学到的神经网络,其思想归根结底全都是最小二乘法. 1-1 “多线 ...
- github团队协作教程
跟着笔者魔鬼般的步伐,我们一起来瞅瞅一个团队协作的任务如何进行版本管理吧~ 要跟上哦~ =============================================== 首先我们先来看下 ...
- codeforces#505--B Weakened Common Divisor
B. Weakened Common Divisor time limit per test 1.5 seconds memory limit per test 256 megabytes input ...
- Oracle Schema Objects——View
Oracle Schema Objects Oracle视图View 普通视图.物化视图 视图(视图不包含数据,不是段对象,不占用空间,只是一个代码.) 作用: 简化SQL 为安全,不暴露表的名称 视 ...
- HDU_3486_Interviewe
Interviewe Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- python装饰器的应用案例
目录 一.过程编程 二.面向装饰器和函数的编程 三.二的加强版 一.过程编程 (一)需求:打印菱形 1.空格.*号组成的菱形 2.输入菱形上半部分的行数即可打印 3.支持循环输入 (二)代码 from ...
- android 的 ExpandableListView Example Tutorial
https://www.journaldev.com/9942/android-expandablelistview-example-tutorial Welcome to Android Expan ...
- python 异常处理、进程
目录: 异常处理 python进程 python并发之多进程 一.异常处理(try...except...) 1.程序中难免出现错误,而错误分成两种: a.语法错误: b.逻辑错误(逻辑错误) 2.异 ...
- 11Qt样式表
Qt样式表 Qt样式表的思想很大程度上是来自原HTML的层叠式样式表(CSS),通过调用Qwdiget::setStyleSheet()或是Qapplication::setStyleSheet(), ...