目录
一、socket是什么?
socket又叫套接字,是用于主机间进行通信的API,工作在TCP/IP协议之上,浏览器、手机应用、用于服务器管理的SSH客户端等均是基于socket实现的。
要通过socket与不同主机间建立通信,需要指定主机的ip地址和端口号;ip地址用于标识唯一主机,端口号用于标识主机上的特定服务或者应用程序,其值是一个16位的数字,取值范围从0到65535。
常用的socket有两种类型:TCP套接字和UDP套接字。
TCP:传输控制协议,基于数据流,可靠传输、有序传输,更适合需要可靠传输的应用,如文件传输、电子邮件、Web浏览等。
UDP:用户报文协议,以报文为单位收发数据,不保证数据一定被收到,更低延迟、占用更少系统资源,更适合语音通话等实时性较高的应用。
本文主要关注TCP套接字。
在TCP中,数据收发的双方分别称为:服务器和客户端,服务器被动等待客户端的连接,不会主动发起请求。
二、如何利用socket在两端进行数据传输?
服务器端:
1.创建套接字(socket)
服务器使用socket()函数创建一个套接字。
socket(int domain, int type, int protocol)
int domain:AF_INET:代表使用IPv4的地址家族
int type:SOCK_STREAM:代表使用的socket类型是TCP协议
2.绑定套接字(bind)
服务器使用bind()函数将套接字关联到某一个网卡(网络接口)和端口号上,网卡可以通过ip地址指定,这样客户端就可以通过这个地址和端口找到该服务器。
3.监听连接(listen)
服务器使用listen()函数使套接字进入监听状态,并等待客户端的连接请求。
4.接受连接(accept)
服务器使用accept()函数等待并接受客户端的连接请求。accept()函数会阻塞,直到一个客户端连接请求到达。一旦接受连接,accept()会返回一个新的套接字socket c(称为已连接套接字)和客户端的ip地址,专门用于与客户端进行通信。
5.数据传输(send/recv)
一旦连接建立,服务器可以使用send()函数发送数据,使用recv()函数接收数据,可以多次调用,发送接收多个数据包。
6.关闭连接(close)
数据传输完成后,服务器端使用close()函数关闭套接字。这会触发TCP的四次挥手过程,正式关闭连接。
客户端:
1.创建套接字(socket)
客户端使用socket()函数创建一个套接字。
2.发起连接请求(connect)
客户端使用connect()函数向服务器的ip地址和端口号发起连接请求,这个请求会触发TCP的三次握手过程。
3.数据传输(send/recv)
一旦连接建立,客户端可以使用send()函数发送数据,使用recv()函数接收数据,可以多次调用,发送接收多个数据包。
4.关闭连接(close)
数据传输完成后,客户端使用close()函数关闭套接字。这会触发TCP的四次挥手过程,正式关闭连接。
具体相关实现函数可见以下参考:
博主:后知~
TCP的套接字的socket通信_如何用套接字描述一个tcp连接-CSDN博客
三、在编程中如何实现TCP套接字通信?
几乎所有的编程语言都支持socket,用法相同,语法不同。
c实现socket通信参见:
博主:后知~
TCP的套接字的socket通信_如何用套接字描述一个tcp连接-CSDN博客
python实现socket通信参见:
TCP/IP网络通信之Socket编程入门_哔哩哔哩_bilibili
四、进一步理解socket
socket其实是个代码库or接口层,位于内核和应用程序之间,提供一些高度封装的接口。在os内核空间中,实现网络传输功能的结构是sock,基于不同的协议和应用场景有不同类型的sock,它们结合硬件共同实现了网络传输功能。
为了将这部分功能暴露给用户的应用程序使用,便引入了socket层,同时将sock嵌入到文件系统的框架中,sock就变成了一个特殊的文件,同时创建一个文件,文件有个句柄fd,之后将这部分功能抽象成一个个简单的API接口,之后只需要调用这些接口即可实现数据的传输,这些接口即是send()、listen()、bind()、recv()等等。
socket fd是一个int类型的数字,可以理解为文件系统的身份证号码,通过其可以确定是哪一个sock,将文件句柄暴露给用户,用户操作fd文件系统,就可以将操作指向内核sock结构,从而操作内核sock的网络传输能力。
参考视频:
参考资料:
[网络] TCP协议是什么?套接字Socket是什么?它们是什么关系?_网络_虎猫_EICHO-Cloudpods (csdn.net)