我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得依靠Socket。那什么是Socket?Socket的类型有哪些?还有Socket的基本函数,这些都是本篇笔记想要介绍的内容。看了本篇笔记之后,就能够回答下面问题了,要是不能的话,说明看的姿势不对,哈哈哈。

1:网络中进程之间如何通信?
2:Socket是什么?
3:Socket的基本操作(指函数)有哪些?
4:Socket中TCP的三次握手建立连接详情。
5:Socket中TCP的四次握手释放连接详情。

网络中进程之间如何通信?

本地的进程间通信(IPC)有很多种方式,但可以总结为下面四种:


1:消息传递(管道、FIFO、消息队列)
2:同步(互斥量、条件变量、读写锁、文件和写记录锁、信号量)
3:共享内存
4:远程过程调用

好吧,上面的这四种只是对本地进程之间通信的一个了解。

我们这里要讨论的是网络中进程之间如何通信?也就是,你的电脑进程和我的电脑进程的通信。进程就得要有唯一标识。如本地进程的PID,那么我要调用你电脑的进程,那显然这个PID就是不适用的。那这种情况应该如何唯一的表示进程呢?

其实TCP/IP协议族已经帮我们解决了这个问题,网络层中的“ip地址”可以唯一标识网络中的主机,而传输层的“协议+端口”可以唯一标识主机中的应用程序(进程)。这样利用三元组(ip地址、协议、端口)就可以标识网络的进程了,网络中的进程通信就可以利用这个标识与其它进程进行交互。

使用TCP/IP协议的应用程序通常采用编程接口:UNIX BSD的套接字(Socket)和UNIX System V的TLI(已经被淘汰),来实现网络进程之间的通信。
就目前而言,几乎所有的应用程序都是采用Socket,而现在又是网络时代,网络中进程通信是无处不在,这就是我为什么说“一切皆Socket”。

Socket是什么?
上面我们已经知道网络中的进程是通过Socket来通信,那什么是Socket呢?Socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open——读写read/write——关闭close”模式来操作。“我”的理解就是Socket就是该模式的一个实现,Socket就是一种特殊的文件,一些Socket函数就是对其进程的操作(打开,读写,关闭)。

Socket的基本操作有哪些?
既然Socket是“open——write/read——close”模式的一种实现,那么Socket就是提供了这些操作对应的函数接口。下面以TCP为例,介绍几个基本的Socket接口函数。
1:socket()函数 相当于Open
2:bind()函数 把一个地址绑定给Socket
3:listen()、connect()函数 作为一个服务器,在调用Socket(),bind()之后就会调用listen()来监听这个Socket,如果客户端这时调用connect()发出连接请求,服务器端就会接收到这个请求。
4:accept()函数 TCP服务器端依次调用socket()、bind()、listen()之后,就会监听指定的socket地址。TCP客户端依次调用socket()、connect()之后就想TCP服务器发送一个连接请求。TCP服务器监听到这个请求之后,就会调用accept()函数去接收请求。
5:read()、write()等函数。
通过上述1,2,3,4中的方法,这里服务器和客户已经建立好了连接。可以调用网络I/O进行读写操作了,即实现网络中不同进程之间的通信。 网络I/O操作有下面5组:

  • read()/write()
  • recv()/send()
  • readv()/writev()
  • recvmsg()/sendmsg()
  • recvfrom()/sendto()

6:close()函数 在服务器端与客户端建立连接之后,会进行一些读写操作,完成了读写操作之后就要关闭相应的socket描述字,好比操作完打开的文件要调用fclose关闭打开的文件。

Socket中TCP的三次握手建立连接详情:
 title= 大致流程如下:

  1. 客户端向服务器发送一个SYN J
  2. 服务器接收客户端发送过来的SYN J 并进行确认ACK J+1;同时服务器向客户端响应一个SYN K
  3. 客户端对服务器端响应的SYN K进行确认,向服务器端发送一个ACK K+1

总结:客户端的connect在第三次握手的第二个次返回,而服务器端的accept在三次握手的第三次返回。

Socket中TCP的四次挥手详情:
 title=

  1. 客户端向服务器发送FIN M(我要结束了)
  2. 服务器给客户端响应ACK M+1(好的,你结束吧,不拦着你)
  3. 服务器端向客户端发送FIN N (我也要结束了)
  4. 客户端给服务器端响应ACK N+1(结束吧,结束吧...不耐烦ing...)

最后:

我对TCP的三次握手和四次挥手的一点说明,上面两张图,有SYN、ACK、FIN三个动作,可是英文分别表示什么意思呢?
原来TCP这三个动作是TCP的位码,也就是TCP的标识,TCP标识有:
SYN(synchronous)标识建立连接
ACK(acknowledgement)确认
PSH(push)传送
FIN(finish)结束
RST(reset)重置
URG(urgent)紧急

参考链接: https://blog.csdn.net/pashanhu6402/article/details/96428887(Socket原理讲解下半部分)

标签: TCP, 进程, Socket, 客户端, 服务器端, 通信

相关文章推荐

添加新评论,含*的栏目为必填