「Netty系列」使用wireshark对网络通信扑捉,进行三次握手和四次挥手原理分析(Netty前置二)

TCP/IP协议栈解析:网络通信的核心原理Java实践 TCP/IP协议栈是现代网络通信的基础架构,采用分层设计将复杂网络通信分解为网络接口层、网络层、传输层应用层。这种分层模型通过标准化的协议(如HTTP、TCP、IP等)实现全球设备的互联互通,其中传输层的TCP协议通过三次握手、数据包确认流量控制机制确保可靠传输。在JavaEE开发中,从Socket编程到NIO框架都深度依赖TCP/IP协议栈,特别是在微服务通信、实时消息推送等场景下,理解协议原理能有效解决粘包拆包、连接超时等典型问题。通过Wireshark抓包分析Netty等现代框架的实践,开发者可 阅读详情

正常下班,文章走起。在网络的通信的时候,都有听说过三次握手四次挥手。但是对其原理是否清晰?本篇文章通过使用wireshark对网络通信扑捉,进行原理分析。

1

BIO代码实现

 

//服务端代码
public class ServerSocket {
    public static void main(String[] args) throws Exception {
        //创建ServerSocket对象,用于客户端的连接
        java.net.ServerSocket serverSocket = new java.net.ServerSocket(8989);
        //定义输入流对象读取数据
        byte[] bytes = new byte[1024];
        try {

            while (true) {
                System.out.println("服务端发生阻塞,等待连接....");
                //调用accept方法监听客户端,阻塞方法
                Socket accept = serverSocket.accept();
                //调用Socket对象的方法获取输入流对象
                InputStream inputStream = ((Socket) accept).getInputStream();
                System.out.println("服务端发生阻塞,等待接收数据....");
                int read = inputStream.read(bytes);
                System.out.println(new String(bytes, 0, read));
                //关闭资源
                accept.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (serverSocket != null && !serverSocket.isClosed()) {
                serverSocket.close();
            }
        }
    }
}

//客户端代码
public class ClientSocket {
    public static void main(String[] args) throws  Exception {
        //创建Socket对象,与服务端Socket建立连接
        Socket socket=new Socket("127.0.0.1",8989);
        //获取输出流对象
        OutputStream  outputStream=socket.getOutputStream();
        System.out.println("客户端阻塞,接收键盘输入....");
        //接收键盘输入,模拟延迟消息发送
        Scanner scanner=new Scanner(System.in);
        String  scannerString=scanner.next();
        outputStream.write(scannerString.getBytes());
        System.out.println("客户端录入完成....");
      //使用输出流对象写入数据
//        outputStream.write("itheima-TCP".getBytes());
         //释放资源
        socket.close();

    }
}

 

 

2

Socket的API(构造方法)

 

Socket():无参构造方法。
Socket(InetAddress address,int port):创建一个流套接字并将其连接到指定 IP 地址的指定端口。
Socket(InetAddress address,int port,InetAddress localAddr,int localPort):创建一个套接字并将其连接到指定远程地址上的指定远程端口。
Socket(String host,int port):创建一个流套接字并将其连接到指定主机上的指定端口。
Socket(String host,int port,InetAddress localAddr,int localPort):创建一个套接字并将其连接到指定远程地址上的指定远程端口。Socket 会通过调用 bind() 函数来绑定提供的本地地址及端口。

 

3

Socket的API( 普通方法)

 

void bind(SocketAddress bindpoint):将套接字绑定到本地地址。
void close():关闭此套接字。
void connect(SocketAddress endpoint):将此套接字连接到服务器。
InetAddress getInetAddress():返回套接字的连接地址。
InetAddress getLocalAddress():获取套接字绑定的本地地址。
InputStream getInputStream():返回此套接字的输入流。
OutputStream getOutputStream():返回此套接字的输出流。
SocketAddress getLocalSocketAddress():返回此套接字绑定的端点地址,如果尚未绑定则返回null。
SocketAddress getRemoteSocketAddress():返回此套接字的连接的端点地址,如果尚未连接则返回 null。
int getLoacalPort():返回此套接字绑定的本地端口。
intgetPort():返回此套接字连接的远程端口

 

4

WebSocket的API(构造方法)

 

ServerSocket():无参构造方法。
ServerSocket(int port):创建绑定到特定端口的服务器套接字。
ServerSocket(int port,int backlog):使用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口。
ServerSocket(int port,int backlog,InetAddress bindAddr):使用指定的端口、监听 backlog 和要绑定到本地的 IP 地址创建服务器

 

5

WebSocket的API(普通方法)

 

Server accept():监听并接收到此套接字的连接。
void bind(SocketAddress endpoint):将 ServerSocket 绑定到指定地址(IP 地址和端口号)。
void close():关闭此套接字。
InetAddress getInetAddress():返回此服务器套接字的本地地址。
int getLocalPort():返回此套接字监听的端口。
SocketAddress getLocalSoclcetAddress():返回此套接字绑定的端口的地址,如果尚未绑定则返回 null。
int getReceiveBufferSize():获取此 ServerSocket 的 SO_RCVBUF 选项的值,该值是从ServerSocket 接收的套接字的建议缓冲区大小。


accept()方法会返回一个和客户端Socket对象相连的Socket对象。使用Socket的getOutputStream可以向客户端发送信息。使getIutputStreamke可以获取客户端传过来数据。

 

6

TCP协议中,建立连接三次握手

 

  1. 简述

    在tcp协议中,双方建立连接的时候是需要三次握手。这个连接建立需要一方主动打开,另外一方被动打开的。下图为建立连接图解。

    上图解释

       SYN(建立连接) 请求建立连接,并在其序列号字段进行序列号的初始值设定。建立连接,设置为1。
        ACK(acknowledgement 确认)  确认号是否有效,一般置为1
        PSH(push传送) 提示接受端应用程序立即从TCP缓冲区把数据读走。
        FIN(finish结束) 希望断开连接。
        RST(reset重置) 对方要求重新建立连接,复位。
        URG(urgent紧急) 紧急指针是否有效。为2,表示某一位被优先处理。

   2. 网络请求建立连接,经历三次握手流程        a 第一次握手在第一次"握手"时,客户端向服务端发送SYN标志位,目的是与服务端建立连接。Seq代表sequence,number(发送数据流序号), 例如:Seq的值是5,说明在数据流中曾经一共发送了 1, 2, 3,4 这4次数据。而在本次"握手"中, Seq的值是0,代表客户端曾经没有给服务端发送数据。另外Len=0也可以看出来是没有数据可供发送的,客户端仅仅发送一个SYN标志位到服端代表要进行连接。

 

        b 第二次握手第二次"握手"时,服务端向客户端发送 SYN ACK 标志位,其中ACK标志位表示是对收到的数据包的确认,说明服务端接收到了客户端的连接。ACK的值是1,表示服务端期待下一次从客户端发送数据流的序列号是1,而Seq=0代表服务端曾经并没有给客户端发送数据,而本次也没有发送数据,因为Len=0也证明了这一点。

 

        c 第三次握手第三次“握手”时,客户端向服务端发送的ACK标志位为1, Seq的值是1。Seq=l代表这正是服务端所期望的Ack=1。Len=0说明客户端这次还是没有向服务端传递数据,而客户端向服务端发送ACK 标志位为1的信息,说明客户端期待服务端下一次传送的Seq的值是1。

    3. 为什么要进行三次握手

为了防止服务器端开启一些无用的连接,增加服务器开销。以及防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。

7

TCP协议中,连接断开时候(四次挥手)

 

    1. 四次挥手

    即TCP连接的释放(解除)。连接的释放必须是一方主动释放,另一方被动释放。以下为客户端主动发起释放连接的图解:


    简述流程
        a 客户端到服务端,我要关了。
        b 服务端到客户端,好的,我收到了。
        c 服务端到客户端,我也关了。
        d 客户端到服务端,好的,收到。

2. 四次挥手执行流程

    

    a 第一次挥手 在第一次"挥手"时,客户端到服务器发送标志位FIN ACK,告知服务端客户端关闭了。Seq=1表示本次数据流的序号为1,Ack=1表示客户端期望服务端下一次发送的数据流的序号为1。len=0,说明没有数据传输到服务端。

    b 第二次挥手 在第二次"挥手"时,服务端向客户端发送标志位ACK,Seq=1代表的正是客户端想看的Ack=1。Ack=2表示服务端期望下一次客户端发送的数据流的序号为2。len=0,说明没有数据传输到客户端。

    c 第三次挥手 在第三次"挥手"时,服务端向客户端发送标志位FIN ACK,告知客户端服务端关闭了。Seq=1代表的正是客户端想看的Ack=1。Ack=2表示服务端期望下一次客户端发送的数据流的序号为2。len=0,说明没有数据传输到客户端。

    d 第四次挥手 在第四次"挥手"时,客户端向服务端发送标志位ACK,告知服务端客户端已经收到服务端关闭信息。Seq=2 代表的正是服务端想看的Ack=2,ACK=2表示客户端期望下一次服务端发送的数据流的序号为2。

    注意 BIO存在问题
        1 客户端已经连接服务端,尚未发送数据,read阻塞
        2 新的客户端无法正常连接
    解决办法
        1 线程解决(mysql客户端连接服务器)
        2 线程池解决(线程池泄露)
        3 NIO解决
        4 websocket

END

 

公众号简介

在上班之余,学习黑马架构课程一段时间了。持续的分享一些干货,如:Netty、MySQL、缓存、中间件、中台、自动化部署、设计模式、JVM、Spring源码、MyBatis源码。如果你想对该公众号有深入了解,在公众号回复【故事】。

公众号福利

关注公众号,回复【架构面试】,获取架构课程面试题。如果有任何建议或者想说的话,请直接向公众号发消息。运营小姐姐看到后会立即处理。烦请耐心等待!蟹蟹!

 

 

 

wireshark抓取dubbo调用实践 本文来看下dubbo的调用,对dubbo调用有一个简单的认识。 阅读详情

相关推荐

Java 11 TLS 1.3性能优化:0-RTT原理与微服务实战

TLS(传输层安全)协议是保障网络通信安全的基石,其核心原理是通过非对称加密协商对称会话密钥,实现数据的加密传输与身份验证。TLS 1.3作为最新版本,通过精简握手流程、强化密码套件,在提升安全性的同时,显著降低了通信延迟。其关键技术价值在于引入了零往返时间(0-RTT)握手,允许客户端在首次消息中携带加密数据,从而在高并发、低延迟场景下实现性能飞跃。这一特性在微服务架构、API网关移动网络等应用场景中价值巨大,能有效降低P95/P99延迟。本文以Java 11为实践平台,深入探讨如何利用TLS 1.3

a359798678的博客 391

c++实现socket:一个服务器对应多个客户端相互传递信息

一个socket对应多个client,每个socket开启一个新的线程。可直接使用

C++ TCP多客户端服务端的实现

通过本篇文章的阅读,我们了解了如何使用C++语言通过TCP协议实现一个支持多客户端连接的服务端,并提供了相关样例代码。在实际应用开发中,还需要根据具体业务需求进行适当的修改优化,以保证服务端的稳定运行高并发性能。在进行网络编程时,经常需要实现一个服务端同时支持多个客户端连接的场景。本篇文章将介绍如何使用C++语言通过TCP协议实现一个支持多客户端连接的服务端,并提供相关样例代码。多客户端服务端的实现思路相对单客户端服务端会复杂一些。可以重复打开多个终端,连接到同一服务端,测试多客户端连接的功能。

2301_79331230的博客 1046

单线程实现同时监听多个端口(windows平台c++代码)

前言   多年前开发了一套网络库,底层实现采用IOCP(完成端口)。该库已在公司多个程序中应用;经过多次修改,长时间检验,已经非常稳定高效。 最近把以前的代码梳理了一下,又加进了一些新的思路。代码结构更加合理,性能也有所提升。打算将该库一些的知识点写出来,以供参考。 服务端要在多个端口监听,这种场合并不多见。但作为一个完善的网络库,似乎有必要支持此功能的。 传统实现方法   如果监听端口...

1179

c++socket多个客户端通过不同端口与一个服务端通信_手写RPC,深入底层理解整个RPC通信...

一、前言RPC,远程过程调用,调用远程方法像调用本地方法一样。RPC交互分为客户端服务端,客户端调用服务端方法,服务端接收数据并打印到控制台,并response响应给客户端。RPCHTTP的联系与区别联系:都是远程通信的网络协议,任何网络协议都包括语法、语义、时序三个特征。区别:HTTP协议是应用层协议,更多地用于前后端通信或移动端、PC端与后端通信,其他的常用应用层协议还包括SSH协议、ft...

weixin_42347739的博客 732

java网络编程_java网络编程之socket编程基础(TCPUDP两种方式)

java生下来一开始就是为了计算机之间的通信,因此这篇文章也将开始介绍一下java使用socket进行计算机之间的通信,在上一篇文章中已经对网络通信方面的基础知识进行了总结,这篇文章将通过代码案例来解释说明。一、网络编程基础因为java网络编程这块是从基础开始讲解的,所以知识点也是由浅入深,因此还是有必要对一些基础的知识进行回顾掌握,如果你是大神,不喜勿喷。1、两台计算机之间的通信两台计算机如何...

weixin_39816027的博客 585

c++的tcp服务类可以连接多个客户端

把tcp连接封装成类,建立面向对象的编程思维,利用多线程可以让tcp服务与多个tcp客户建立连接并通信。

u014220146的博客 843

c++socket多个客户端通过不同端口与一个服务端通信_「Netty系列使用wireshark网络通信,进行三次握手四次挥手原理分析...

正常下班,文章走起。在网络的通信的时候,都有听说过三次握手四次挥手。但是对其原理是否清晰?本篇文章通过使用wireshark网络通信,进行原理分析。1BIO代码实现//服务端代码 public class ServerSocket { public static void main(String[] args) throws Exception { //创建Serve...

weixin_34731825的博客 305

Netty与OpenSSL双向认证实战:从原理到TLS握手深度解析

SSL/TLS协议是保障网络通信安全的基石,它通过非对称加密协商出对称会话密钥,实现数据的机密性与完整性。双向认证(mTLS)在此基础上,要求通信双方交换并验证数字证书,为服务间通信提供了强身份验证,是构建零信任架构的关键技术。其核心价值在于防止中间人攻击未授权访问,广泛应用于金融交易、物联网设备认证及微服务安全通信等场景。本文聚焦于高性能网络框架Netty与密码学库OpenSSL的集成,通过剖析TLS握手流程与事件驱动模型,详解如何构建高安全性的双向认证服务。

weixin_30421809的博客 458

JavaEE网络通信原理与TCP/HTTP协议详解

网络通信是分布式系统的基石,其核心在于协议栈的分层设计与数据传输机制。TCP/IP协议栈通过应用层、传输层、网络层网络接口层的协同工作,实现了端到端的可靠通信。其中TCP协议通过三次握手建立连接、滑动窗口控制流量、超时重传保证可靠性,而HTTP协议作为应用层标准,支撑着现代Web服务体系。在JavaEE开发中,从底层的Socket编程到Servlet容器网络模型,再到Spring等框架的HTTP处理,都需要深入理解这些网络原理。掌握TCP粘包处理、HTTP/2多路复用等关键技术,能够有效解决高并发场景下的

weixin_34050519的博客 749

JavaEE网络通信原理与性能优化实战

网络通信是分布式系统的基石,其核心在于TCP/IP协议栈的分层设计。从物理层到应用层,每层协议各司其职,共同完成数据传输。JavaEE在应用层通过Servlet容器对网络通信进行标准化封装,显著提升了开发效率。理解NIO多路复用原理能有效提升吞吐量,而连接池、零拷贝等技术则能降低资源消耗。在电商、金融等高并发场景中,合理的线程池配置协议选择(如HTTP/2或WebSocket)直接影响系统稳定性。通过tcpdump、Wireshark等工具进行网络诊断,结合JMeter压测数据,可以精准定位性能瓶颈。随着

weixin_30765577的博客 453

Java TCP通信实战:从SocketNetty的网络编程核心

网络通信是分布式系统与微服务架构的基石,其核心在于理解TCP/IP协议栈的工作原理。TCP作为面向连接的可靠传输协议,通过三次握手建立连接、流式数据传输及四次挥手断开连接,确保了数据的有序与完整送达。在Java生态中,这一原理映射为Socket与ServerSocket API,开发者需掌握消息边界处理、线程模型优化等关键技术,以构建高并发服务。针对粘包、半包等常见问题,应用层需采用长度前缀或分隔符等方案进行协议设计。随着并发需求增长,从BIO线程池模型演进至NIO多路复用,最终借助Netty框架的Chan

weixin_33795806的博客 413

从零手写分布式任务调度与Netty网络框架:深度解析核心原理与实战

分布式任务调度是构建高可用、可扩展后端系统的关键技术,其核心在于协调多个节点有序、可靠地执行定时或异步任务。其实现原理通常围绕任务编排、状态管理、故障转移与负载均衡展开。在Java生态中,XXL-JOB作为广泛应用的调度框架,其设计体现了这些核心思想。而高性能的网络通信则是分布式系统交互的基石,Netty通过其Reactor线程模型高效的ByteBuf内存管理,为高并发场景提供了底层支撑。理解这两者的底层实现,对于深入掌握分布式系统架构、优化应用性能具有重要价值。本文聚焦于一个教学级的开源项目,它通过从零

weixin_33910137的博客 865

android socket 长连接_TCP/IP,httpsocket,长连接,短连接

点击上方蓝色字体,选择“标星公众号”优质文章,第一时间送达上一篇:这300G的Java资料是我师傅当年给我的,免费分享给大家下一篇:这200G的Java实战资料是我师傅当年教我的第招作者 | ksfzhaohui来源 |my.oschina.net/OutOfMemory/blog/95803TCP/IPTCP/IP是个协议组,可分为三个层次:网络层、传输层应用层。在网络层有IP协...

weixin_39562579的博客 491

Linux Socket绑定的端口号实际端口号不一致

在编程时候出现了,实际绑定端口号给定端口号不同。是因为端口号赋值出了问题。 addr.sin_port = htons(port);//之前是 addr.sin_port = port; 新指令:netstat -tln显示所有端口号的连接情况

feather(猎羽) 3088

socket编程,server接受到的端口号与client设置的不一致的问题

很多教材的serverclient程序都是在同一主机上运行的,故server的程序分别做了创建、绑定、接收(反馈);client程序做了创建、发送(接受反馈)。 server程序与client程序都设置了端口号为8888,但是发现运行的结果中,server接受到的client的发送端口却不是8888,且每次都不相同。 这是在client中没有调用bind绑定地址,而且,在server程序与c

x901205的专栏 3372

【网络】Wireshark分析Netty建链过程( tcp三次握手、osi模型)

osi模型简述 OSI定义了网络互连的七层框架(物理层、数据链路层、网络层、传输层、会话层、表示层、应用层),即ISO开放互连系统参考模型。如下图左边部分。在每个分层中,都会对所发送的数据附加一个首部,在这个首部中包含了该层必要的信息,如源ip地址目的ip地址等。 osi模型中,在下一层的角度看,当收到上一层的包时,全部会被认为是本层的数据,然后在本层中加上自己本层的首部,继续往下传递。一个数...

m0_45406092的博客 1043
上一篇: 「Netty系列」彻底弄清网络七层协议、TCP/IP、IP、TCP(Netty前置一)
下一篇: 「Netty系列」一文熟悉NIO(Netty前置三)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值