socket一般也稱做"套接字",用於描述IP地址和端口,是一個通訊鏈的句柄,應用程序一般經過"套接字"向網絡發出請求或者應答網絡請求。html
socket起源於Unix,而Unix/Linux基本哲學之一就是「一切皆文件」,對於文件用【打開】【讀寫】【關閉】模式來操做。socket就是該模式的一個實現,socket便是一種特殊的文件,一些socket函數就是對其進行的操做(讀/寫IO、打開、關閉)服務器
socket和file的區別:網絡
在一個機器上有許多的協議,如http smtp dns ftp ssh snmp icmp dhcp …… ,這些協議大多都是在osi七層模型中傳輸層之上的應用層,傳輸層纔開始能真正的傳輸數據;Icmp 是網絡層,不傳輸數據,就發一個ping包;ssh
兩個機器實現通訊必須實現一些規則,也就是遵循 TCP/IP協議 或者UDP 的協議;socket
對於TCP/IP 、UDP 收發消息的封裝就是socket;Socket 就只作兩件事情,收數據,發數據;收發什麼數據本身定義;tcp
代碼實現以下:函數
#客戶端
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)類型的數據server
#Python3 中只能發送byte類型的數據htm
-------------------------------------------------
能夠根據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