Socket原理
我们经常谈到互联网,以及OSI 推出的七层模型(比较理想,过于复杂),其实早期西方国家设备进行互联通信还没有一个统一的标准,谁发展的好推广的快,谁就占了主动,每一个在发展的时候都遇到一些各自的问题。后来是一个军方的项目使用的TCP/IP协议,慢慢的推广出来,占了上风,网络也就这样慢慢的连起来了,后来越来越多的国家都连起来,成为了事实上的标准。对于不跟底层打交道的编程人员来说,不希望去考虑那么多协议上的事情,只是为了实现基本的通信功能。socket是一种通用的网络编程接口,基于TCP/IP协议,简化了网络通信的很多步骤。 socket 本义是插座,相当于两端插座 中间搭建了一个管道(通过IP进行互联)就可以通信了,我们不用关心太细节的实现,只需要跟socket接口打交道,中间什么协议的事情不是太关心。一个socket 其实就是一个(ip, port),ip我们好理解,可以理解为管道两端的节点,端口是干什么的呢。端口实际上是socket 与应用程序之间进行了一层绑定。两端应用程序之间的通信,一个数据发过来了,通过ip可以找到管道的节点,再通过port找到对应的应用程序,就可以通信了。
python 提供的socket库的实现原理如上图所示,我们之前讲到一个socket 其实就是一个(ip, port),从服务端来看bind函数后面就是接(ip,port)
,但注意只有执行了listen 函数后,端口才算真正意义上的绑定了。那为什么客户端这边没有绑定具体的端口呢,实际上这里的绑定在connect函数里给隐藏了,客户端从自己的空闲端口随便找了一个,不需要我们关心到底使用什么ip, 什么port, 它自己内部保证只要不出错就可以了。connect需要传的参数是服务端的(ip,port), 因为你要知道自己去哪儿。我们知道TCP连接是面向连接的,服务器与一个客户端之间通过socket tcp进行了连接,那服务器的这个socket不就占用住了,如何能够与另一个客户端进行连接和通信呢?这要求我们深入理解accept背后的原理,accept 是一个阻塞函数,阻塞直到客户端有连接connect,它会开辟另一个子socket, 使得刚传过来的请求连接与这个子socket 建立tcp连接,然后你们之间要通信自己去玩,它依然在监听中。
网友评论