# 网络编程
2台机器之间的通信 -- 网卡 - mac地址 - 物理地址 多台机器之间的通信 -- 交换机 mac 世界唯一 ip地址 虚拟地址 随着时间/空间变化而变化 ipv4 4位点分十进制 0.0.0.0 - 255.255.255.255 ipv6 6位:分十六进制 0.0.0.0.0.0 - 255.255.255.255.255.255 127.0.0.1 本机回环地址 0.0.0.0 本机所有的ip 包括127.0.0.1/实际ip 交换机的工作方式: 单播/广播/组播 arp协议 通过ip找mac 交换机:广播 将要找的机器的信息发给局域网内的所有机器 交换机-->单播 返回要找机器的那台机器 公网 ip: 不管在哪都能找见的ip地址 内网 ip: 校园网,公司内网,员工网 保留字段: 专门给内网使用,公网ip永远不会占用内网ip的地址 192.168.0.1 - 192.168.255.255 172.168.0.1 - 172.168.255.255 10.0.0.1 - 10.255.255.255
局域网与局域网之间的机器通信 你要找的两台机器之间的网络是通的 机器a -->机器b 机器a -->交换机 -(网关ip)-> 路由器 -...-> 路由器 -(网关ip)-> 交换机 --> 机器b 我怎么知道机器a和机器b不是一个网段的? 子网掩码 机器a和子网掩码 进行一个按位与 网段信息 机器b和子网掩码 进行一个按位与 网段信息 两个网段信息一致说明是一个局域网的,不一致说明不在一个局域网
交换机工作机制: 只认识mac地址, 广播\单播\组播 路由器工作机制: 路由表,认识ip地址 网关ip? 子网掩码? 端口 0-65535 # 通过某一个端口定位到机器上的某一个应用 22 端口 操作系统ssh命令
传递信息的方式
TCP协议 打电话 : 可靠的\面向连接的\慢
UDP协议 发短信 : 不可靠的\无连接的\快
计算机OSI协议 https://baike.baidu.com/item/%E4%B8%83%E5%B1%82%E6%A8%A1%E5%9E%8B/1441391#2_1 应用层 : socket :承包了下面四层复杂的数据包的封装 传输层 : tcp/udp 端口 四层路由器 四层交换机 网络层 : ip地址 三层路由器 三层交换机 数据链路层 : mac arp协议 二层交换机 网卡 物理层 数模转换 高低电平
tcp 的黏包问题:
产生原因: 不是bug,而是各种tcp协议的特点和算法导致了现在的问题:
合包机制,拆包机制,流式传输无边界
什么时候要解决黏包? 连续send且不是在大文件传输过程中
发送大文件 不需要解决黏包问题
黏包问题解决办法:
server 要想发送具体的文件数据,先要将文件的大小\文件的名称都要发送给client端
两台机器之间通信 : 网络
网络开发的架构:
c/s client-server 例子就是各种独立软件 iqiyi youku letv tmall 等 一般说的是 .exe文件
b/s browser-server 所有的b/s也是c/s架构 浏览器解放了你的桌面图标,web编程都是b/s架构的
IP - Internet Protocol Address,又译为网际协议地址
"端口"是英文port的意译,可以认为是设备与外界通讯交流的出口。
windows上查看端口占用的情况 netstat -aon|findstr "49157"
ip地址精确到具体的一台电脑,而端口精确到具体的程序。
-- socket TCP 是基于连接的,必须先启动server,然后载启动客户端取链接server
理解socket 其实站在你的角度上看,socket就是一个模块。我们通过调用模块中已经实现的方法建立两个进程之间的连接和通信。 也有人将socket说成ip+port,因为ip是用来标识互联网中的一台主机的位置,而port是用来标识这台机器上的一个应用程序。 所以我们只要确立了ip和port就能找到一个应用程序,并且使用socket模块来与之通信。
- server端 - import socket sk = socket.socket() sk.bind(('127.0.0.1',8898)) #把地址绑定到套接字 sk.listen() #监听链接 conn,addr = sk.accept() #接受客户端链接 ret = conn.recv(1024) #接收客户端信息 print(ret) #打印客户端信息 conn.send(b'hi') #向客户端发送信息 conn.close() #关闭客户端套接字 sk.close() #关闭服务器套接字(可选)
- client端 - import socket sk = socket.socket() # 创建客户套接字 sk.connect(('127.0.0.1',8898)) # 尝试连接服务器 sk.send(b'hello!') ret = sk.recv(1024) # 对话(发送/接收) print(ret) sk.close() # 关闭客户套接字
tcp协议和udp协议 TCP(Transmission Control Protocol)可靠的、面向连接的协议(eg:打电话)、传输效率低全双工通信(发送缓存&接收缓存)、面向字节流。使用TCP的应用:Web浏览器;电子邮件、
文件传输程序。 UDP(User Datagram Protocol)不可靠的、无连接的服务,传输效率高(发送前时延小),一对一、一对多、多对一、多对多、面向报文,尽最大努力服务,无拥塞控制。使用UDP的应用:
域名系统 (DNS);视频流;IP语音(VoIP)
-- socket UDP 无连接的,启动服务之后可以直接接受消息,不需要提前建立连接
简单使用
- server - import socket udp_sk = socket.socket(type=socket.SOCK_DGRAM) #创建一个服务器的套接字 udp_sk.bind(('127.0.0.1',9000)) #绑定服务器套接字 msg,addr = udp_sk.recvfrom(1024) #接收 print(msg) udp_sk.sendto(b'hi',addr) # 对话(接收与发送) udp_sk.close()
- client -
import socket ip_port=('127.0.0.1',9000) #ip 端口 udp_sk=socket.socket(type=socket.SOCK_DGRAM) udp_sk.sendto(b'hello',ip_port) #发送 back_msg,addr=udp_sk.recvfrom(1024) #接受 print(back_msg.decode('utf-8'),addr)