标签:存在 十六 消息传递 端口 网址 子网 网络资源 port 时间短
C/S架构:
B/S架构:只要在浏览器输入网址就可以直接使用了
B/S更好:更节省资源,不用更新,不依赖环境,
C/S架构:安全性,程序比较庞大
? 是一个物理地址,在网卡中存在的,唯一的标识你的网络设备
交换机:完成局域网内通信
路由器:完成局域网间通信(网关)
子网掩码(了解):255.255.255.0
端口号:
3306 mysql 数据库
6379 redis端口
5000 flask端口
##server
import socket
sk = socket.socket()
sk.bind(("127.0.0.1",9043))
sk.listen()
conn,addr = sk.accept()
conn.send(b‘hi‘)
msg = conn.recv(1024).decode("utf-8")
print(msg)
conn.close()
sk.close()
```Python
##client
import socket
sk = socket.socket()
sk.connect(("127.0.0.1",9043))
msg = sk.recv(1024).decode("utf-8")
print(msg)
sk.send("傻子".encode("utf-8"))
sk.close()
```
osi七层协议
osi五层协议:
? 上传,下载,邮件,可靠,面向连接,速度慢,能传递的数据长度不限
两边需要先连接
三次握手
第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。 第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。 第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
消息传递:(主要看发送,连接时的状态)
断开连接
四次挥手
(第一次挥手 当客户端向服务端请求断开,这时会发送fin的标记报文。 第二次挥手 当服务端收到客户端fin断开报文时候,可能正在处理数据,此时服务端会发生ack报文。 第三次挥手 当服务端处理完成后,会再次向客户端发送FIN报文,此时可以断开连接。 第四次挥手 当客户端收到服务端的fin报文,会向服务端发送确认ACK,经过两个msl《Maximum Segment Lifetime》时长后断开连接。)
? 即时通讯软件,不可靠,面向数据报,速度快,能传递的数据长度有限
1. 支持一对一,一对多,多对多
? 当多条消息发送时接受变成了一条或者出现接收不准确的情况
粘包现象会发生在发送端
粘包现象会发生在接收端
本质:发送的每一条数据之间没有边界
步骤:
计算要发送的数据字节长度
把字结的长度变成4字节,借助struct
1. 计算要发送的数据字节长度
2. 把字节的长度变成4字节
3. 发送这4个字节
4. 发送数据
1. 客户端:
验证客户端的合法性:
import socket
import hashlib
SECRET_KEY = b‘alexbigs‘
def check_client():
randbytes = sk.recv(32)
md5 = hashlib.md5(SECRET_KEY)
md5.update(randbytes)
code = md5.hexdigest().encode(‘utf-8‘)
sk.send(code)
sk = socket.socket()
sk.connect((‘127.0.0.1‘,9001))
check_client()
print(‘正常的客户端通信‘)
import os
import socket
import hashlib
SECRET_KEY = b‘alexbigsb‘
def check_client(conn):
randbytes = os.urandom(32)
conn.send(randbytes)
md5 = hashlib.md5(SECRET_KEY)
md5.update(randbytes)
code = md5.hexdigest()
code_cli = conn.recv(32).decode(‘utf-8‘)
return code == code_cli
sk = socket.socket()
sk.bind((‘127.0.0.1‘,9001))
sk.listen()
while True:
conn,addr = sk.accept()
if not check_client(conn):continue
print(‘进程正常的通信了‘)
# import os
# import hmac # hashlib==hmac
# randbytes = os.urandom(32)
# mac = hmac.new(SECRET_KEY,randbytes)
# ret = mac.digest()
# print(ret)
并发的socket
模块socketserver -- 上层模块.
客户端
import socket
sk = socket.socket()
sk.connect((‘127.0.0.1‘,9001))
while True:
ret = sk.recv(1024)
print(ret)
import time
import socket
sk = socket.socket()
sk.bind((‘127.0.0.1‘,9001))
sk.listen()
while True:
conn,addr = sk.accept()
n = 0
while True:
conn.send(str(n).encode(‘utf-8‘))
n+=1
time.sleep(0.5)
标签:存在 十六 消息传递 端口 网址 子网 网络资源 port 时间短
原文地址:https://www.cnblogs.com/heyulong1214/p/12069949.html