客户端/服务器架构
1.硬件C/S架构(打印机)
2.软件C/S架构(互联网中处处是C/S架构):B/S架构也是C/S架构的一种,B/S是浏览器/服务器
C/S架构与socket的关系:我们用socket就是为了完成C/S架构的开发
OSI七层协议(*******)
互联网协议按照功能不同分为osi七层或tcp/ip五层或tcp/ip四层
每层运行常见物理设备
引子:
须知一个完整的计算机系统是由硬件,操作系统,应用软件三者组成,具备了这三个条件,一台计算机系统就可以自己跟自己完了(比如玩个扫雷).如果你要跟别人一起玩,那就需要上网了,什么是互联网?
互联网的核心就是一对协议的组成,协议就是标准,比如全世界人通信的标准是英语
如果把计算机比作人的话,互联网协议就是计算机界的英语,所有的计算机都学会了互联网协议,那所有的计算机就可以按照统一的规则标准去收发消息进行通信了,人们按照分工不同把互联网协议从逻辑上划分成了层级。
详见网络通信原理!
为何学习socket一定要先学习互联网协议呢?
首先C/S架构是基于网络通信的
然后网络的核心就是一堆网络协议,也就是协议标准。如果你想开发一款基于网络通信的软件,就必须遵循这些标准。
socket层
socket是什么?
socket是应用层与TCP/IP协议通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议隐藏在socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。所以,我么们无需深入的去理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然遵循tcp/udp标准的。
基于TCP协议的Socket
套接字的分类:
基于文件类型的套接字家族:AF_UNIX(在Unix系统上,一切接文件,基于文件的套接字调用的就是底层的文件系统来取数据,两个套接字进程同时运行在同一机器上,可以通过访问同一文件系统间完成通信)
基于网络类型的套接字家族:AF_INET(在Python中支持很多种地址家族,但是由于我们只关心网络编程,所以大部分时候我们只用AF_INET)
套接字工作流程:
下面我们举个打电话的例子来说明一下:
如果你要给一个朋友打电话,先拨号,朋友听到电话铃声后提起电话,这时你和你的朋友就建立起了链接,就可以讲话了。等交流结束,挂电话结束此次交谈。生活中的场景就解释了这工作原理。(如果你去一家餐馆吃饭,假设那里的老板就是服务端,而你就是客户端,当你去吃饭的时候,你肯定的知道那个餐馆的地址,对于你自己来说,老板不需要你的地址。)
注意:
如果你在重启服务端的时候可能会遇到这样的问题:
这个是由于你的服务端仍然存在四次挥手的time_wait状态在占用地址(如果不懂,请深入研究1.tcp三次握手,四次挥手2.syn洪水攻击3.服务器高并发情况下会有大量的time_wait状态的优化方法)
解决上述方法:
1 #加入一条socket配置,重用ip和端口 2 3 phone=socket(AF_INET,SOCK_STREAM) 4 phone.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #就是它,在bind前加 5 phone.bind(('127.0.0.1',8080))