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()
来源:https://www.cnblogs.com/sandy-123/p/10408513.html