物理层规定物理介质的相关规范 好比网线接口是什么样的 有几根线程序员
问题:没法理解单纯的二进制数据服务器
工做在这一层的是以太网网络
规定一组电信号有多少位架构
每一组电信号包含什么样的内容socket
每一台电脑必须拥有一个全球惟一的mac地址(能够有多个) ide
经过广播的方式来找到对方的mac地址函数
问题:不可能 全球广播 会形成广播风暴(广播太多 网络瘫痪)学习
工做在这一层的是ip地址spa
网络地址协议code
给每一给计算机分配一个ip地址
一般是ipv4
0.0.0.0-255.255.255.255
前三段为网络号
后一段为主机号
子网掩码来判断是否处于同一个局域网
arp协议把ip转成mac地址的协议
ip协议主要的目的就是 找到全球范围内的某一个局域网存在某一台具体的计算机
问题:一个数据包到达对方计算机后到底交给哪一个应用程序来处理
TCP UDP
用于规范数据传输方式,以及识别应用程序(端口号)
TCP:可靠,效率低 由于其须要不断的发送确认信息
适用于:对数据完整性高的程序 好比支付数据 文字信息
UDP:不可靠传输,效率高于TCP 彻底不关心 对方是否收到数据发送到网络中就完事
适用于:视频聊天 语音 即时对战游戏
至关于对讲机 bp机
主要用于规定双方应用程序之间以什么形式来传输数据
这一层的数据形式是有程序员本身制定的常见有HTTP FTP EMAIL等等
封装了传输层一堆协议的模块
何时使用
当你须要开发一款 C/S架构的应用程序的时候 就须要它
基于C/S架构的应用程序 须要分别开发服务器和客户端程序
学习的重点就是 如何使用socket编写服务器程序以及如何使用socket编写客户端程序
一般应该先开发服务器
import socket ''' 1.买一个手机 2.买一个手机卡 3.开机待机 4.接通电话 5.唠嗑 6.挂电话 7.关机 ''' # 1.买一个手机 # 默认状况下建立的是基于强罗的TCP协议的socket对象 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 参数1:协议家族 网络的为AF_INET # 参数2:type 用于设置采用的传输协议 TCP的为SOCK_STREAM UDP的为SOCK_DGRAM # 其他参数默认便可 # 端口号取值 0-65535 0-1023 是系统保留的 # 重用端口号当你已经关闭了服务器 可是仍是报异常说 端口占用 时 可使用 s.setsockopt() s.bind(('192.168.14.56', 8006))#也是一个阻塞的函数会一直等到 s.listen() # 监听客户端的链接 # c_client 当接收到请求时会返回一个表示客户端的socket对象 # 客户端的socket对象就负责 这个客户端的数据收发 # c_address同时返回对方的ip和端口 打包成元组 c_client, c_address = s.accept() # 接收客户端的链接请求 该函数会阻塞 直到有链接 # 开始收发数据 # recv接收数据 # buffersize缓冲区大小 data = c_client.recv(1024) print(data) # 断开与这个客户端的链接 c_client.close() # 关闭服务器 socket 后续的客户端就没法子啊链接到服务器了 # 通常正常服务器时不关的 s.close() # 关机
'''
服务器程序的大体流程
1.建立socket独享
2.绑定ip和port
3.监听链接
4.接受请求
5.接收数据
6.断开链接
'''
import socket # 建立socket对象 c = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 与服务器创立链接 传入服务器的ip和端口 c.connect(('127.0.0.1', 8006)) # 收发数据 只能发送bytes类型的数据(任何数据都能发) c.send('hello'.encode('utf-8')) # 断开与服务器来链接 c.close()
import socket s = socket.socket() s.bind(('127.0.0.1', 8888)) s.listen() while True: c, address = s.accept() print('收到请求') while True: try: data = c.recv(1024) if not data: print('客户端下线了!') break print('收到一个数据', data.decode('utf-8')) data += b'dsb' c.send(data) except ConnectionResetError: print('对方异常断开链接!') break
import socket s = socket.socket() s.connect(('127.0.01', 8888)) while True: res = input('>>>(退出):').strip() if res == 'q': break if not res: continue s.send(res.encode('utf-8')) data = s.recv(1024) print(data)