TCP服务/客户端
- 服务端:被动等待链接
- socket(AF_INET, SOCK_STREAM) -> s
- s.bind( (‘127…’,8000) ) #服务端绑定了自己的IP和端口
- s.listen(5) 真正打开服务器监听
- 5:链接等待数量
- 服务器真正的连接数量,一般不会超过服务器的最大打开文件个数
- s.accept() c,addr 阻塞等待别人链接
- c.recv(bytes).decode 接受消息
- c.send(bytes).encode 发送消息
- 客户端:主动链接
- socket() -> c
- c.connect() #客户端只需要链接
- c.send()
- c.recv()
- 公网IP,
- 0~1024
- 端口:0~65535
- 0~1023:公认端口
- 1024~49151:注册端口,不同的程序可以按照自己的需求来使用
- 49151~65535:动态端口,一般程序自己安排使用的
- 客户端的IP和端口:伪造的
- random(255).random(255).random(255).random(255)
- random(49151~65535)
- TCP泛洪(DDOS):大量的伪造IP和端口向服务器发起连接
- ACK
- 三次握手
- 心跳包,呼吸包:为了保证链接持续,要一定时间向目标服务器发送短小精悍
- 为了长连接
- TCP的单进程服务器只能同时处理一个客户端
- 保证一个链接
- 单进程里100个人,
- 链接状态,TCP
UDP服务器
-
udp服务器:
- socket(AF_INET, SOCK_DGRAM) -> s
- s.bind( () ) #UDP服务器只需要绑定自身可用IP和端口即可
- data,c_addr = s.recvfrom() #获取这个套接字接受到的数据
- data:发来的数据
- c_addr:谁发来的
- s.sendto(msg, c_addr)
-
udp客户端:
- socket(AF_INET, SOCK_DGRAM) -> c
- c.sendto(msg, s_addr)
- data, s_addr = c.recvfrom()
-
#TCP: #send #recv #UDP: #sendto #recvfrom
-
阿里云默认给你的IP是虚拟化出来的
-
阿里云主机有安全策略,8000UDP/TCP 不开启的
-
scapy:组数据包
- SYN
- ACK
- URG
- RST
- FIN
-
TCP泛洪攻击
-
文件传输:UDP/TCP
- os模块
- 文本文件
- 进制文件
tcp实例
- 服务器代码
import socket
ip = '' #IPV4
port = 8000
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind( (ip,port) ) #绑定可用IP和端口
s.listen(5)
print('服务器开启...')
#服务别人
while True:
try:
c,addr = s.accept() #阻塞 就等了 没有人连接我,下面的代码不能执行
# print(addr) #客户端的来访IP和端口元组
# print(c)
while True:
#具体的服务这个c
data = c.recv(1024) #接收客户端的数据
if data:
print('[%s]:%s' % (addr,data.decode('utf-8')))
msg = input('>>> ')
c.send(msg.encode('utf-8')) #向客户端返回数据
else:
c.close()
break
except KeyboardInterrupt:
s.close()
break
print('服务器关闭')
#OSError: [Errno 98] Address already in use 立即释放
- 客户端代码
import socket
ip = '47.98.190.149' #IPV4
port = 8000
c = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#c.bind( (ip,port) ) #绑定可用IP和端口
c.connect( (ip,port) )
#我链接时候不需要制定我使用哪个端口
while True:
try:
msg = input('>>> ')
c.send(msg.encode('utf-8')) #向服务端发送数据
data = c.recv(1024) #阻塞的
if data:
print('[服务器]:',data.decode('utf-8'))
else:
print('服务端关闭')
c.close()
break
except KeyboardInterrupt: #ctrl + c
c.close()
break
#UE: 对比差异
#GUI编程
udp实例
- 服务器代码
import socket
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.bind( ('',8000))
while True:
data,c_addr = s.recvfrom(1024)
print('[%s]:%s' % (c_addr,data.decode('utf-8')))
msg = input('>>> ')
if msg == 'q' or msg == 'quit':
break
s.sendto(msg.encode(), c_addr)
print('服务端关闭')
s.close()
- 客户端代码
import socket
c = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#IPV4 UDP的套接字
ip = '47.98.190.149'
port = 8000
while True:
try:
msg = input('>>> ')
if msg == 'quit' or msg == 'q':
break
c.sendto(msg.encode('utf-8'),(ip,port))
data,s_addr = c.recvfrom(1024)
#AttributeError: 'tuple' object has no attribute 'decode'
print('[%s]:%s' % (s_addr,data.decode('utf-8')))
except KeyboardInterrupt:
break
c.close()