socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,对于文件用【打开】【读写】【关闭】模式来操作。socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)
socket和file的区别:
- file模块是针对某个指定文件进行【打开】【读写】【关闭】
- socket模块是针对 服务器端 和 客户端Socket 进行【打开】【读写】【关闭】
在一个机器上有许多的协议,如http smtp dns ftp ssh snmp icmp dhcp …… ,这些协议大多都是在osi七层模型中传输层之上的应用层,传输层才开始能真正的传输数据;Icmp 是网络层,不传输数据,就发一个ping包;
两个机器实现通信必须实现一些规则,也就是遵循 TCP/IP协议 或者UDP 的协议;
对于TCP/IP 、UDP 收发消息的封装就是socket;Socket 就只做两件事情,收数据,发数据;收发什么数据自己定义;
代码实现如下:
#客户端
import socket
client = socket.socket() #声明socket类型,同时生成socket连接对象
client.connect(("localhost",6969)) #连接哪个ip的哪个端口
client.send(b"Hello World") #发送消息
data = client.recv(1024) #接收1024个字节,也就是1Kb #接收数据
print("recv:",data)
client.close()
----------------------------------------------------------------------------
#服务器端
import socket
server = socket.socket()
server.bind(('localhost',6969)) #绑定要监听的端口
server.listen() #监听
print("我要开始等电话了")
conn,addr = server.accept() #等电话打进来,接收电话
#conn 就是客户端连接过来而在服务器端为其生成的一个连接实例;客户端连接过来的时候会带上自己的ip 和端口
# Addr 就是客户端的ip地址和端口
print(conn,addr)
print("电话来了")
data = conn.recv(1024)
conn.send(data.upper()) #把接收到的消息,修改为大写,返回给客户端
server.close() #服务器端关闭所有连接,如果有多个客户端连接都关闭
#Python 2 中可以发送byte和字符串(str)类型的数据
#Python3 中只能发送byte类型的数据
-------------------------------------------------
可以根据socket.SOCK_RAW修改IP头,可以实现dos(洪水)攻击,因为是tcp协议的有三次握手,客户端给服务器端发一个连接数据ip和端口是伪造的,服务器端收到后给那个ip 的端口发送一条建立连接的数据,一直等待客户端确认回复,因为等待确认回复的时候也占用资源,所以大量发送不存在的ip和端口和服务器建立连接的的数据,就可以达到洪水攻击;nignx可以实现把等待时间调小点,让占用资源快速释放;
客户端给服务器端发送数据的时候会带上本机的ip和请求的端口;
参考:
http://www.cnblogs.com/wupeiqi/articles/5040823.html
https://www.cnblogs.com/fanweibin/p/5053328.html
https://www.cnblogs.com/aylin/p/5572104.html
#洪水攻击参考:
https://www.cnblogs.com/lang5230/p/5507775.html