TCP协议-socket通信
TCP协议和UDP协议都属于端口协议,属于传输层
TCP协议 : 可靠的,面向连接,流式协议,安全,效率低 转账,文件传输....
UDP协议 : 快速,效率高,不可靠 微信,qq等聊天软件.....
TCP协议建立连接三次握手,断开连接四次挥手
三次握手:
客户端 --------------发送syn = 1 seq = 233432(随机序列号)请求建立链接-----------> 服务端
客户端 <----------发送 ack = 1 + 233432回应,且同时发送 syn = 1 seq = 68578请求建立链接--- 服务端
客户端 ------------------发送ack = 1 + 68578回应,建立链接------------------------> 服务端
总共建立两个通道
syn洪水攻击:一个服务器接收的客户端请求非常多
TCP协议又称好人协议,有一些黑客,造大量的假ip,发送请求,首先真的ip进不去,然后服务端处理大量的假ip,服务端会定时发送请求,与假ip建立链接,服务端容易崩
四次挥手:
客户端 ---发送fin = 1 seq = 34562 请求断开链接----------> 服务端
客户端 <----------回应ack = 1 + 34562 断开链接--------- 服务端
客户端 <----------发送fin = 1 seq = 67929请求断开链接---- 服务端
客户端 -------- 回应ack = 1 + 67929 断开链接-----------> 服务端
注释:客户端给服务端发送完所有数据后,就会马上发送fin请求,关闭客户端到服务端的通道,但是此时服务端到客户端的数据还没有发送完毕,所有需要等到服务端将所有返回给客户端之后,服务端再发送fin数据,关闭另一个通道
套接字socket
python中的socket是一个模块,与网络通信相关的模块 在应用层和传输层中间 是socket抽象层
基于socket进行简单通信
# 服务端: import socket phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # socket.AF_INET 基于网络的socket socket.SOCK_STREAM:基于TCP协议的socket phone.bind(('192.168.16.197',8848)) # 绑定ip地址和端口 '127.0.0.1'是本地回环地址,只允许本计算机访问,当服务端和客户端都在一个计算机上时,可以使用这个ip # 端口号范围在8000--65535 phone.listen(5) #监听 # 服务端可以接收N个链接,但是只能同一时刻回应5个请求 conn,addr = phone.accept() # 等待电话 阻塞等待 # conn = 管道 # addr = 地址 from_client_date = conn.recv(1024) # 每次最多接收1024个字节 print(from_client_date) conn.send(from_client_date.upper()) conn.close() phone.close() # 客户端: import socket phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 括号内参数可以不写,默认 phone.connect(('192.168.16.69',8888)) msg = input('>>>') phone.send(msg.encode('utf-8')) #发送字节 from_server_date = phone.recv(1024) print(from_server_date) phone.close()
基于socket的通信循环
# 服务端: import socket phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) phone.bind(('192.168.16.197',8848)) phone.listen(5) conn,addr = phone.accept() while 1: from_client_date = conn.recv(1024) print(from_client_date) conn.send(from_client_date.upper()) conn.close() phone.close() # 客户端: import socket phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) phone.connect(('192.168.16.69',8888)) while 1: msg = input('>>>') phone.send(msg.encode('utf-8')) from_server_date = phone.recv(1024) print(from_server_date) phone.close()
基于socket的连接循环
# 服务端: import socket server = socket.socket() server.bind(('127.0.0.1',9045)) server.listen(5) while 1: conn,addr = server.accept() while 1: try: from_client_date = conn.recv(1024) print(from_client_date.decode('utf-8')) content = input('>>>') conn.send(content.encode('utf-8')) except Exception: break conn.close() server.close() # 客户端: import socket client = socket.socket() client.connect(('192.168.16.69',8888)) while 1: msg = input('>>>') if msg.upper() == 'Q': break client.send(msg.encode('utf-8')) from_server_date = client.recv(1024) print(from_server_date.decode('utf-8')) client.close()