当前位置: 首页 > java >正文

网络套接字基础使用和概念

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、IP
  • 二、port
  • 三、TCP/UDP
  • 四、socket编程接口
    • sockaddr


前言

这篇文章更大的形式是以笔记来写的,因此会简略很多基础概念等等。
从网络设计的视角来看,它是脱胎于操作系统的,每层协议都极大程度的解耦并对应于一个计算机体系层,而网络通信其实可以看做是一个冯诺依曼体系在通信。而其中细节和遇到问题并解决便是我们要学的知识点。
套接字(Socket)是网络编程的核心概念,本质是操作系统提供的一种通信端点抽象,用于在不同主机或同一主机的进程间传输数据。它封装了底层网络协议(如 TCP/IP、UDP、Unix Domain Socket 等)的复杂性,为开发者提供统一的编程接口。


一、IP

IP地址可以理解为一台计算机的身份证

IP(Internet Protocol,网际协议)是互联网通信的核心协议,负责在网络层(OSI 第 3 层)为数据包提供寻址和路由功能。它定义了数据如何在复杂网络中从源设备传输到目标设备。

它包含两个版本IPv4和IPv6,区别在于描述地址的长度不同。IPv4当前面临地址不足问题,IPv6的推广我们国家占了重要的一部分,但受制于技术和政治。

二、port

在网络通信中,IP保证找到哪一个计算机,而仅仅找到目标计算机还不够,因为计算机中那么多软件,还得定位到是哪个进程,端口号(port)便可以理解为进程的一种标识符,但是直接用进程id不更好吗,又何必多此一举呢?这其中便涉及到解耦合的设计了,如果网络通信强关联进程id的话,如果后面更改协议或者对操作系统做变更,便会牵一发而动全身。

  • 端口号(port)基础概念:
  1. 端口号是传输层协议的内容。
  2. 端口号是一个2字节16位的整数。
  3. 端口号用来标识一个进程,告诉操作系统,当前的这个数据要交给哪一个进程来处理。
  4. 一个端口号只能被一个进程占用。

三、TCP/UDP

网络协议栈是贯穿整个体系结构的,在应用层、操作系统层和驱动层各有一部分。当我们使用系统调用接口实现网络数据通信时,不得不面对的协议层就是传输层,而传输层最典型的两种协议就是TCP协议和UDP协议。

TCP协议

TCP协议叫做传输控制协议(Transmission Control Protocol),TCP协议是一种面向连接的、可靠的、基于字节流的传输层通信协议。

TCP协议是面向连接的,如果两台主机之间想要进行数据传输,那么必须要先建立连接,当连接建立成功后才能进行数据传输。其次,TCP协议是保证可靠的协议,数据在传输过程中如果出现了丢包、乱序等情况,TCP协议都有对应的解决方法。

UDP协议

UDP协议叫做用户数据报协议(User Datagram Protocol),UDP协议是一种无需建立连接的、不可靠的、面向数据报的传输层通信协议。

使用UDP协议进行通信时无需建立连接,如果两台主机之间想要进行数据传输,那么直接将数据发送给对端主机就行了,但这也就意味着UDP协议是不可靠的,数据在传输过程中如果出现了丢包、乱序等情况,UDP协议本身是不知道的。


所谓的可靠和不可靠是一种性质而不是一种好坏。

四、socket编程接口

socket=ip+port.。
创建一个socket就相当于开辟一个文件,只不过这个文件作用于网络通信,通过给定的接口达到网络通信的目的。

socket常见API
创建套接字:(TCP/UDP,客户端+服务器)

int socket(int domain, int type, int protocol);

绑定端口号:(TCP/UDP,服务器)

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

监听套接字:(TCP,服务器)

int listen(int sockfd, int backlog);

接收请求:(TCP,服务器)

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

建立连接:(TCP,客户端)

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);


sockaddr

套接字不仅支持跨网络的进程间通信,还支持本地的进程间通信(域间套接字),其中得益于sockaddr数据结构的设计,类似于继承,我们传参时通过协议家族(AF)传入socketaddr_in或者socketaddr_un来决定是那种通信。然后通过强转即可达到目的。
在这里插入图片描述

此后我们便可以通过这个结构体的数据来达到不同计算机之间寻找双方的目的了。

http://www.xdnf.cn/news/9185.html

相关文章:

  • PaddleNLP 的文本分类项目
  • React--》掌握react组件库设计与架构规划
  • PyTorch 中mm和bmm函数的使用详解
  • SMT贴片制造流程关键环节解析
  • 科技趋势分析系统(BBC)技术全解
  • 通用前端框架项目静态部署到Hugging Face Space的实践指南
  • PHP实战:安全实现文件上传功能教程
  • 封装渐变堆叠柱状图组件附完整代码
  • C语言基础-初识
  • R包安装报错解决案例系列|R包使用及ARM架构解决data.table安装错误问题
  • WPF【11_5】WPF实战-重构与美化(MVVM 实战)
  • 计算机网络学习20250527
  • pycharm终端遇不显示虚拟环境的问题
  • Windows版本的postgres安装插件http
  • java的vscode扩展插件
  • 【】20250527PDF文件拆分成多个pdf(两页一份,用幼儿班级姓名命名文件)
  • CentOS 7 下 Redis 从 5.0 升级至 7.4.3 全流程实践
  • 基线配置管理:为什么它对网络稳定性至关重要
  • RabbitMQ搭建集群
  • Odoo 财务模块全面深度解读(VIP15万字版)
  • xcode手动安装iOS Simulator Runtime
  • 2.4GHz 射频前端芯片AT2401C
  • 【Elasticsearch】PUT` 请求覆盖式更新
  • GitHub push失败解决办法-fatal: unable to access ‘https://github.com/xxx
  • 【node】Express创建服务器
  • leetcode hot100刷题日记——19.买卖股票的最佳时机
  • `sysctl`命令深度剖析:如何优化内核参数以提升服务器网络/IO性能?
  • 百度ocr的简单封装
  • html5视频播放器和微信小程序如何实现视频的自动播放功能
  • 优雅草最新实战项目技术Discuz X3.5电子签约插件开发项目实施方案优雅草·卓伊凡