参考资料:
https://huoding.com/2013/11/21/299
https://hpbn.co/building-blocks-of-tcp/#three-way-handshake

示例代码:
https://github.com/gordonklg/study,socket module

A. Wireshark

免费抓包工具,谁用谁知道。
根据端口过滤 frame 的方法:tcp.port==8888
默认安装的 Winpcap 不能对 localhost 抓包,建议安装 Npcap。

B. TCP 三次握手


上图描述了 TCP 建立连接过程中三次握手的过程。

写一段测试代码建立连接,以便 WireShark 抓包分析:
gordon.study.socket.basic.wireshark.ThreeWayHandshake.java

 public class ThreeWayHandshake {

     @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();
while(true) {
System.out.println(socket.getInputStream().read());
}
} catch (Exception e) {
}
}
}).start(); Socket socket = new Socket();
socket.connect(new InetSocketAddress(8888));
}
}

上图为 WireShark 抓取的 TCP 三次握手过程中的报文,三条记录分别对应三次握手过程。当前选中的 Frame 13 是客户端的 SYN 请求,其前4个 Bytes 是链路层相关的信息(不知何意),中间20个 Bytes 是 IPv4 数据报首部,最后32个 Bytes 是 TCP 报文段。


照着上面 TCP 报文段格式图表,我们可以分析出:

  • 第一次握手是客户端发出的 SYN 请求(因为 SYN 标记位置为1),其产生了随机序号 00011000 01001000 10111111 11011111。
  • 服务端接收到 SYN 请求后,将客户端发送的序号值加1作为确认号(00011000 01001000 10111111 11100000),并将 ACK 标记位置为1表示自己是 ACK 请求。同时,服务端也要向客户端发出 SYN 请求,因此要将SYN 标记位置为1,同时生成随机序号。
  • 客户端验证 ACK 无误后,用相同的逻辑回复服务端的 SYN 请求。至此,TCP连接建立完毕。
 
 
 
 

Java网络编程学习A轮_02_抓包分析TCP三次握手过程的更多相关文章

  1. Java网络编程学习A轮_03_抓包分析TCP四次挥手

    参考资料: http://www.jellythink.com/archives/705 示例代码: https://github.com/gordonklg/study,socket module ...

  2. 使用 tcpdump 抓包分析 TCP 三次握手、四次挥手与 TCP 状态转移

    目录 文章目录 目录 前文列表 TCP 协议 图示三次握手与四次挥手 抓包结果 抓包分析 TCP 三次握手 数据传输 四次挥手 TCP 端口状态转移 状态转移 前文列表 <常用 tcpdump ...

  3. Wireshark抓包分析TCP“三次握手,四次挥手”

    1.目的 客户端与服务器之间建立TCP/IP连接,我们知道是通过三次握手,四次挥手实现的,但是很多地方对这个知识的描述仅限于理论层面,这次我们通过网络抓包的方式来看一下实际的TCP/IP传输过程. 2 ...

  4. 用wireshark抓包分析TCP三次握手、四次挥手以及TCP实现可靠传输的机制

    关于TCP三次握手和四次挥手大家都在<计算机网络>课程里学过,还记得当时高超老师耐心地讲解.大学里我遇到的最好的老师大概就是这位了,虽然他只给我讲过<java程序设计>和< ...

  5. 脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手

    .引言 网络编程中TCP协议的三次握手和四次挥手的问题,在面试中是最为常见的知识点之一.很多读者都知道“三次”和“四次”,但是如果问深入一点,他们往往都无法作出准确回答. 本篇文章尝试使用动画图片的方 ...

  6. [转帖]脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手

    脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手   http://www.52im.net/thread-1729-1-1.html     1.引言 网络编程中TCP协议的三次握手和 ...

  7. Java网络编程学习A轮_01_目标与基础复习

    A. A轮目标 复习网络编程基础知识,重点学习下TCP三次握手四次挥手,以及可能引发的异常情况. 回顾 Socket 编程,好多年没写(chao)过相关代码了. 重学 NIO,以前学的基本忘光了,毕竟 ...

  8. Wireshark抓包分析TCP 3次握手、4次挥手过程

    Wireshark简介 更多有关Wireshark的教程.软件下载等,请见:http://www.52im.net/thread-259-1-1.html,本文只作简要介绍. 1Wireshark 是 ...

  9. Java网络编程学习A轮_06_NIO入门

    参考资料: 老外写的教程,很适合入门:http://tutorials.jenkov.com/java-nio/index.html 上面教程的译文:http://ifeve.com/overview ...

随机推荐

  1. Linux环境下NodeJS的安装配置(HelloWorld)

    Linux环境下NodeJS的安装配置(HelloWorld) 最简单的环境安装,测试helloworld.给初学者!! 安装脚本,请仔细阅读逐行执行: #!/bin/bash #检查是否已经安装 r ...

  2. python学习笔记(十一)redis的介绍及安装

    一.redis简介 1.redis是一个开源的.使用C语言编写的.支持网络交互的.可基于内存也可持久化的Key-Value数据库.       2.redis的官网地址,非常好记,是redis.io. ...

  3. STL: fill,fill_n,generate,generate_n

    fill Assigns the same new value to every element in a specified range. template<class ForwardIter ...

  4. WordPress文章自动提取tag并添加链接

    我们在编写文章时,经常需要添加一些标签关键词的链接,这样不仅可以优化我们的内链,对用户来说也可以参照相关的文章,如果对文章的关键字进行手动添加链接,那样对我们来说太麻烦了,而且在标签关键词很多的情况下 ...

  5. 初探Nginx服务器的整体架构

    高度模块化的设计是 Nginx 的架构基础.Nginx 服务器被分解为多个模块,每个模块就是一个功能模块,只负责自身的功能,模块之间严格遵循“高内聚,低耦合”的原则. 核心模块 核心模块是 Nginx ...

  6. ResultMap和ResultType在使用中的区别

    在使用mybatis进行数据库连接操作时对于SQL语句返回结果的处理通常有两种方式,一种就是resultType另一种就是resultMap,下面说下我对这两者的认识和理解 resultType:当使 ...

  7. hdu5716

    地址: 题目: 带可选字符的多字符串匹配 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Oth ...

  8. IDEA 程序直接运行分析

    今天用IDEA运行SpringBoot程序,启动时始终报错说读取不到datasource的url配置. 分析代码的resources目录,是有配置文件的,配置也是正常的.如下图: 后来经人指点,是因为 ...

  9. C++中去掉string字符串中的\r\n等

    string imagedata;imagedata = “dudau\r\ndadafca\r\n” CString Image; Image = imagedata.c_str(); Image. ...

  10. 如何配置IIS服务器?

    1, 先安装IIS 然后安装vs; 注: 顺序颠倒则执行cmd命令: 1,cd \ 2,cd Windows 3, cd  Microsoft.NET 4, dir 5,cd Framework 6, ...