• Java随笔-Socket


    定义

    套接字,一种独立于协议的网络编程的接口,对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。Socket是应用层与TCP/IP协议族通信的中间软件抽象层,是一组接口。在设计模式中,Socket属于门面模式,因为把TCP/IP协议族隐藏在Socket后面,对于用户来讲,这组接口就是全部了,具体的数据让Socket去组织就可以了。
    请添加图片描述
    应用程序就包含Socket和解析器即可,不需要针对每一层的协议进行处理,所有的工作都可以交给Socket完成,无需处理细节。应用程序和传输层之间的联系就是Socket。

    类型

    Socket注意类型有:流套接字、数据报套接字、原始套接字。

    1. 流套接字。流套接字用于提供面向连接、可靠的数据传输服务。该服务将保证数据能够实现无差错、无重复送,并按顺序接收。流套接字之所以能够实现可靠的数据服务,是因为使用了TCP协议。
    2. .数据报套接字。数据报套接字提供一种无连接的服务。该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现数据重复,且无法保证顺序地接收到数据。数据报套接字使用UDP协议进行数据的传输。
    3. 原始套接字。原始套接字可以读写内核没有处理的IP数据包,而流套接字只能读取TCP协议的数据,数据报套接字只能读取UDP协议的数据。因此,如果要访问其他协议发送的数据必须使用原始套接。

    构成

    Socket一般由五部分构成:协议,本地地址,外部地址,状态,PID。

    • 协议,一般指的是TCP或UDP。
    • 本地地址,通信还没有开始的时候为0.0.0.0。
    • 外部地址,通信未开始时我为0.0.0.0,开始后就是具体的IP地址了。
    • 状态,应用程序与连接之间的各种状态。
    • PID,进程id,用于识别进程

    有时候Socket中可以没有协议部分。
    在这里插入图片描述
    如上图中,每一行都是一个Socket。协议:TCP,本地地址:0.0.0.0:135,外部地址:0.0.0.0:0,状态:LISTENING,PID:1296。

    创建

    Socket是和应用程序一起建立的。应用程序中包含Socket组件,应用程序启动时,会调用Socket申请创建Socket,然后协议栈就会根据申请创建Socket。

    1. 分配Socket内存空间。
    2. 向内存中放入控制信息。
    3. 返回描述符给应用程序,应用程序根据描述符调用属于自己的Socket。

    通信

    客户端Socket创建完毕后,客户端需要查询服务端的IP地址,并将IP地址告诉协议栈,解决数据要去哪里的问题。
    服务端Socket创建完毕后,客户端需要告知服务端自己的IP和端口号,解决数据从哪里来的问题。

    请添加图片描述
    若是短连接,每次Socket发送接受后都要断开连接,常用于web网站。若是长连接就不需要多次建立连接,整个通信过程中只需要一次连接和关闭,常用于点对点通信。
    TCP连接通过三次握手后,建立连接,可以开始发送数据。
    当应用程序将要发送数据时,会调用write将将要发送的数据交给协议栈,协议栈将数据序列化,添加各种报头,然后让数据包放入缓冲区,根据各种策略和实际情况进行发送。发送数据有几个标准:

    1. 数据包过大,操作系统会根据每个网络包能够容纳的数据长度(MTU)进行分包。
    2. 缓冲区并非只有达到阈值后才发送数据,等待时间太长也会提前发。

    发送过程中通过请求-确认机制进行你来我往,当数据发送完成后,通过四次挥手断开连接。
    断开连接后整个通信过程的工作还没有结束,客户端和服务端会等待一段时间后把Socket删除。

  • 相关阅读:
    STP生成树协议详解
    React动画实现方案之 Framer Motion,让你的页面“自己”动起来
    第四百零一回
    【大厂招聘试题】__嵌入式开发工程师_2023届“联想”_1
    在python里如何实现switch函数的功能
    Python中的多线程(史上最简单易懂版)
    limit坑位
    【EI会议征稿】第五届人工智能、网络与信息技术国际学术会议(AINIT 2024)
    线程的概念及使用
    轻松拿捏C语言——【文件操作】
  • 原文地址:https://blog.csdn.net/qq_34202054/article/details/126345806