正常下班,文章走起。在网络的通信的时候,都有听说过三次握手四次挥手。但是对其原理是否清晰?本篇文章通过使用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源码。如果你想对该公众号有深入了解,在公众号回复【故事】。

公众号福利

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

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

  1. Node 学习八、通信之 01 网络通信基本原理、网络层次模型、数据封装与解封装、TCP三次握手与四次挥手

    网络通信基本原理 网络通信(或通讯)模型和通讯协议(常见的 HTTP.TCP/IP.FTP等)解决的本质问题就是主机与主机之间的网络通信. 下面以最基本的两台主机之间的通信开始,慢慢认识网络通信模型和 ...

  2. 使用 WireShark 分析 TCP/IP 三次握手和四次挥手

    目录 TCP包头分析 TCP三次握手 TCP四次挥手 TCP包头分析 注释: 端口号范围:0-65535 源端口号:是客户端进程随机生成的,一般是从50000开始的 目标端口号:一般是服务器固定的.如 ...

  3. TCP协议---三次握手和四次挥手详解 (不看后悔系列)

    目录 TCP协议简介 TCP报头 TCP工作原理 科来解码详解 wireshark解码详解 三次握手和四次挥手 数据包的大致结构 你不知道的三次握手 为什么需要有三次握手? 为啥只有三次握手才能确认双 ...

  4. Wireshark图解TCP三次握手与四次挥手

    Wireshark图解TCP三次握手与四次挥手 1. TCP 包头结构 2 三次握手 2.1 图解 2.2 使用 tcpdump 和 wireshark 解读三次握手过程 3 四次挥手 3.1 客户端 ...

  5. 面试必会系列 - 5.2 详解OSI模型与七层协议,网络TCP/IP基础,三次握手、四次挥手等

    本文已收录至 Github(MD-Notes),若博客中图片模糊或打不开,可以来我的 Github 仓库,包含了完整图文:https://github.com/HanquanHq/MD-Notes,涵 ...

  6. tcp wireshark 过滤syn_使用 WireShark 分析 TCP/IP 三次握手 和 四次挥手

    TCP 三次握手 示意图 Wireshark 抓包注意事项 为了演示一个TCP三次握手建立连接的过程,我们通过 Chrome 访问一个网页. 已知 HTTP 协议就是建立在TCP链接上的 通过 Cmd ...

  7. 【极客思考】计算机网络:Wireshark抓包分析TCP中的三次握手与四次挥手

    [前提说明] 前段时间突然看到了一篇关于TCP/IP模型的文章,心想这段时间在家里也用wireshark抓了点包,那么想着想着就觉得需要复习一下网络知识,于是就有这篇博文的诞生.当然网上关于TCP相关 ...

  8. 什么是TCP三次握手和四次挥手【重点学习系列---干货十足--一文详解】

    引言 本文将会从一个爱情的故事开始,着力从什么是三次握手.为什么是三次而不是俩次或者四次.TCP关闭的过程.为什么要四次挥手.而不是三次.为什么最后是2MSL.什么是2MSL这些问题展开分析,详解,让 ...

  9. 关于三次握手与四次挥手面试官想考我们什么?--- 不看后悔系列

    在面试中,三次握手和四次挥手可以说是问的最频繁的一个知识点了,我相信大家也都看过很多关于三次握手与四次挥手的文章,今天的这篇文章,重点是围绕着面试,我们应该掌握哪些比较重要的点,哪些是比较被面试官给问 ...

最新文章

  1. 如何正确运用计算机,如何正确使用电脑
  2. 网络即服务(NaaS)是什么???
  3. 以Post方式发送数据采用WebClient
  4. ITK:表面提取之前平滑二值图像
  5. Android在第三方应用程序系统应用尽早开始,杀死自己主动的第三方应用程序,以重新启动...
  6. php strtoupper 和 array_change_key_case 字符串转大写,小写
  7. sap tcode 功能对照表_Python for Ev3练习amp;Minstorms对照表02
  8. Windows Server 2012 配置 Remote Desktop Service VDI
  9. (Windows)获取系统显示的缩放比例方法
  10. win10安装wget,从此可以更快的下载文件 and windows10 下 zip命令行参数详解
  11. easypoi的excel导出单元格只能选下拉选项工具类
  12. 弹窗的点击空白关闭,背景虚化,防止滚动穿透
  13. 通过单击按钮实现全屏、退出全屏
  14. python编写五子棋小游戏 (电脑自走棋)
  15. 海南大学 838信号与系统专业课的感悟
  16. Triton服务器部署Yolov5s模型应用
  17. leetcode2187. 完成旅途的最少时间(mid)(282)
  18. 扑克牌中的顺子(C++)
  19. java教材管理系统,基于web的教材管理系统
  20. 【001 设备驱动】主设备号和次设备号的用途

热门文章

  1. 【计算机毕业设计】智慧社区管理系统
  2. 【信奥赛一本通】 1376:信使(msner)(详细代码)
  3. 研究生数学建模竞赛——近五年赛题分析以及数据分析类赛题优秀论文分享
  4. 【Windows10】电脑副屏的指示箭头是什么?
  5. C# 防止界面假死 多线程进度条的合理使用
  6. Solidworks如何显示装饰螺纹线
  7. 小觅智能 | VINS 学习笔记
  8. IOS13图标尺寸_iOS 13 中 30+ 个精心设计的出色功能。
  9. python modbus-tk 实现三菱FX5U modbus-tcp 从站通讯
  10. 使用Amara将字幕添加到您的网络视频中