网络套接字基础使用和概念
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、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)基础概念:
- 端口号是传输层协议的内容。
- 端口号是一个2字节16位的整数。
- 端口号用来标识一个进程,告诉操作系统,当前的这个数据要交给哪一个进程来处理。
- 一个端口号只能被一个进程占用。
三、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来决定是那种通信。然后通过强转即可达到目的。
此后我们便可以通过这个结构体的数据来达到不同计算机之间寻找双方的目的了。