原始碼如下
from scapy.all import *
import logging
logging.getlogger('scapy.runtime').setlevel(loggin程式設計客棧g.error)
target_ip = '192.168.1.1'
target_port = 80
data = 'get / http/1.0 \r程式設計客棧\n\r\n'
def start_tcp(target_ip,target_port):
global sport,s_seq,d_seq #主要是用於tcp3此握手建立連線後繼續傳送資料
try:
#第一次握手,傳送syn包
ans = sr1(ip(dst=target_ip)/tcp(dport=target_port,sport=randshort(),seq=randint(),flags='s'),verbose=false)
sport = ans[tcp].dport #源隨程式設計客棧機埠
s_seq = ans[tcp].ack #源序列號(其實初始值已經被服務端加1)
d_seq = ans[tcp].seq + 1 #確認號,需要把服務端的序列號加1
#第三次握手,傳送ack確認包
send(ip(dst=target_ip)/tcp(dport=target_port,sport=sport,ack=d_seq,seq=s_seq,flags='a'),verbose=false)
except exception,e:
print '[-]有錯誤,請注意檢查!'
print e
def trans_data(target_ip,target_port,data):
#先建立tcp連線
start_tcp(target_ip=target_ip,target_port=target_port)
#print sport,s_seq,d_seq
#發起get請求
ans = sr1(ip(dst=target_ip)/tcp(dport=target_port,sport=sport,seq=s_seq,ack=d_seq,flags=24)/data,verbose=false)
#ans.show()
#讀取服務端發來的資料
rcv = ans[raw]
print rcv
if __name__ == '__main__':
#start_tcp(target_ip,target_port)
trans_data(target_ip,target_port,data)
執行結果如下
wireshark抓包截圖如下:
本文標題: 基於python模擬tcp3次握手連線及傳送資料
本文位址:
TCP3次握手4次分手
tcp三次握手解析帶圖 四次分手 由於 tcp連線是全雙工的,因此每個方向都必須單獨進行關閉。這個原則是當一方完成它的資料傳送任務後就能傳送乙個 fin來終止這個方向的連線。收到乙個 fin只意味著這一方向上沒有資料流動,乙個 tcp連線在收到乙個 fin後仍能傳送資料。首先進行關閉的一方將執行主動...
TCP3次握手與4次揮手
3次握手過程狀態 listen 這個也是非常容易理解的乙個狀態,表示伺服器端的某個socket處於監聽狀態,可以接受連線了。syn sent 當客戶端socket執行connect連線時,它首先傳送syn報文,因此也隨即它會進入到了syn sent狀態,並等待服務端的傳送三次握手中的第2個報文。sy...
TCP 3次握手4次揮手 複習
學習自 握手syn syn ack ack未連線佇列 服務端維護乙個未連線佇列,當客戶端發來ack時,伺服器會入佇列乙個相應的標識,那個標識是已接收ack狀態,然後會發syn ack,當客戶端再次傳送ack後,出佇列那個相應的標識,正式建立連線 為何要3次握手?假如客戶端傳送syn,但是莫名滯留了,...