socket(简称 套接字) 是进程间通信的一种方式,实现不同主机间的进程间通信,比如QQ
socket.socket(AddressFamily, Type)
Address Family:可以选择 AF_INET(用于 Internet 进程间通信) 或者 AF_UNIX(用于同一台机器进程间通信),实际工作中常用AF_INET
Type:套接字类型,可以是 SOCK_STREAM(流式套接字,主要用于 TCP 协议)或者 SOCK_DGRAM(数据报套接字,主要用于 UDP 协议)
UDP发送数据
from socket import *
udpSocket = socket(AF_INET, SOCK_DGRAM)# 创建套接字
sendAddr = ('192.168.1.1', 8080)# 发送到的ip和端口
sendData = "hello" # 发送的内容
udpSocket.sendto(sendData, sendAddr) #发送
udpSocket.close() # 关闭套接字
UDP接收数据
from socket import *
udpSocket = socket(AF_INET, SOCK_DGRAM)# 创建套接字
bindAddr = ('', 7788)# 绑定本机的端口,ip地址为空表示本机的任何一个ip
udpSocket.bind(bindAddr)#绑定本机的端口
recvData = udpSocket.recvfrom(1024)# 等待接收的数据,1024表示本次接收的最大字节数
print(recvData)
udpSocket.close()# 关闭套接字
udp广播
import socket, sys
dest = ('<broadcast>', 7788)# 这里<broadcst>可以写成当前网段的广播地址
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 创建udp套接字
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST,1)# 设置成能发送广播数据
s.sendto("Hi", dest)# 发送广播
TCP:传输控制协议,稳定,慢一些,web服务器(HTTP)使用tcp
UDP:用户数据包协议,不稳定,快一些
TCP三次握手,四次挥手
TCP十种状态
TTL是指经过路由器的个数
MSL数据包在网络上存活的最长时间
TCP
socket默认是TCP
def __init__(self, family=socket.AF_INET, type=socket.SOCK_STREAM,
proto=0, *args, **kwargs):
TCP服务端
1.socket创建一个套接字
2.bind绑定ip和port
3.listen使套接字变为监听状态
4.accept等待客户端的信息
5.recv/send接收发送数据
from socket import *
tcpSerSocket = socket(AF_INET, SOCK_STREAM) # 创建TCPsocket
address = ('', 7788) #绑定本地的ip和端口
tcpSerSocket.bind(address)
tcpSerSocket.listen(5)# 将socket变为监听状态,listen是建立连接的**队列**的个数,linux之中这个值是默认的,更改无效,阻塞
newSocket, clientAddr = tcpSerSocket.accept()#如果有客户端连接,则生成一个专门的套接字进行通讯,阻塞
recvData = newSocket.recv(1024) #获得客户端发送过来的消息
newSocket.send("thank you !")# 向客户端发送消息
newSocket.close() #关闭该客户端的套接字
tcpSerSocket.close() #关闭监听的套接字
TCP客户端
from socket import *
tcpClientSocket = socket(AF_INET, SOCK_STREAM)# 创建TCP socket
serAddr = ('192.168.1.102', 7788)
tcpClientSocket.connect(serAddr) #连接服务器
tcpClientSocket.send("hello") #向服务器发送消息
recvData = tcpClientSocket.recv(1024) # 接收消息
tcpClientSocket.close() # 关闭套接字
常见TCP攻击
DDOS SYN洪水攻击
客户端发完SYN,不发ACK
DNS攻击
DNS服务器劫持,换域名对应的IP
arp 中间人攻击