一、 C/S 架构:Client/Server 客户端/ 服务端
B/S 架构:Browser/Server 前端/ 服务端
网卡--> mac地址-->ip地址-->子网掩码-->网关-->DNS服务器(进行域名domain name 和与之相对应的ip地址转换的服务器)
DHCP(自动分配IP) NAT(网络地址转换) 端口 路由器
交换机 集线器 广播 单播 广播风暴 arp协议 路由协议
1. TCP五层通信 OSI七层通信
网络通信协议是网络传输的灵魂,非常重要,协议即准则,准则是传输消息的格式要求。
2. TCP/IP 协议存在:传输层
TCP:面向连接,消息可靠,效率相对差,<面向流的消息格式>,无消息保护边界,比如:打电话、web浏览器、文件传输程序
UDP: 面向无连接,消息不可靠,效率高,<面向包的消息格式>,有消息保护边界,域名系统(DNS)、视频流、IP语音(VoIP)
TCP三次握手:
1. client --> [SYN] --> server client请求建立连接
2. client <--[SYN/ACK] <--server server收到syn 发送[SYN/ACK]确认
3. client --> [ACK] --> server client收到[SYN/ACK]再发一个[ACK]确认
TCP四次挥手:
1. client --> [ACK/FIN] --> server client发送包,请求关闭
2. client <--[ACK] <-- server server收到包,同意关闭
3. clinet <-- [ACK/FIN] <-- server server收到包,client是否收到 同意关闭 消息
4. client -->[ACK/FIN] --> server client发送确认收到 关闭包
概念: Socket 是任何一种计算机网络通讯中最基础的内容,它是 [应用层] 和 TCP/IP协议簇通信的中间软件抽象层,它是一组接口。
套接字有两种:
基于文件类型:AF_UNIX
基于网络类型:AF_INET ---- 使用最广泛的一个 这里还有一个AF_INET6 被用于ipv6
TCP和UDP对比:
TCP:是面向流的,如果多次发送的数据很小,并且每次发送间隔时间很短,就有可能会被拼到一个数据流里面。TCP是有序的,可以一段一段取值,只能从头开始
UDP:是面向包的,udp不能取半个包,会报错,如果数据包很大,那么一次性接收的时候,设置的接收大小也要很大,否则会报错,缓冲区错误。
TCP和UDP下socket差异对比图:
1. TCP协议下的Socket
server端
import socket
server = socket.socket() #创建了一个socket对象
ip_port = ("127.0.0.1",8080)
server.bind(ip_port) #将套接字绑定到地址
server.listen() #监听ip地址和端口
conn,addr = server.accept() #阻塞住,等待连接
from_client_msg = conn.recv(1024) #接收消息#1024为消息大小,单位B,MB=1024KB,1KB=1024B
from_client_mst = from_client_msg.decode("utf-8") #接收的消息是bytes类型,需要转换为字符串
print(from_client_msg)
conn.send("人生苦短".encode("utf-8")) #发送消息
conn.close() #关闭连接
server.close()
client端:
import socket
client = socket.socket()
server_ip_port = ("127.0.0.1",8080)
client.connect = (server_ip_port) #连接服务器端
client.send("我用python".encode("utf-8")) #发送消息 #send里面的消息必须是字节类型的
from_server_msg = client.recv(1024)
from_server_msg = from_server_msg.decode("utf-8")
print(from_server_msg)
client.close()