成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

動(dòng)手學(xué)習(xí)TCP系列之環(huán)境搭建

網(wǎng)絡(luò) 網(wǎng)絡(luò)管理
TCP(Transmission Control Protocol 傳輸控制協(xié)議)是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議,由IETF的RFC 793定義。

環(huán)境搭建和配置

在開始進(jìn)行實(shí)驗(yàn)之前,首先看看實(shí)驗(yàn)環(huán)境的搭建:

Wireshark:用來抓取網(wǎng)絡(luò)上的包,可以清楚的看到TCP/IP協(xié)議層,以及每層的詳細(xì)信息,通過此處下載

一臺(tái)虛擬機(jī):如果客戶端和服務(wù)端都在本機(jī),那么數(shù)據(jù)通信是不經(jīng)過網(wǎng)卡的,所以Wireshark就抓不到任何數(shù)據(jù)包。方便的辦法就是本機(jī)安裝一個(gè)虛擬機(jī),通過本機(jī)和虛擬機(jī)通信進(jìn)行實(shí)驗(yàn)。我使用的是VirtualBox+winXP.

Pcap.Net:是一個(gè)WinPcap的.NET wrapper,基于這個(gè)庫,我們就可以很方便的通過C#代碼來實(shí)現(xiàn)下面功能(通過此處下載):

獲取網(wǎng)絡(luò)設(shè)備

接收、解析數(shù)據(jù)包

創(chuàng)建、發(fā)送數(shù)據(jù)包

在建立好實(shí)驗(yàn)環(huán)境之后,還需要進(jìn)行一些簡單的配置,保證宿主機(jī)和虛擬機(jī)之間的網(wǎng)絡(luò)是暢通的。

將虛擬機(jī)網(wǎng)絡(luò)設(shè)置為"Host-only Adapter"模式。

 

虛擬機(jī)網(wǎng)絡(luò)設(shè)置好之后,就可以配置本機(jī)和虛擬機(jī)IP地址了,然后保證宿主機(jī)可以ping通虛擬機(jī)。

 

環(huán)境驗(yàn)證

通過上面的步驟,簡單的實(shí)驗(yàn)環(huán)境就建立完成了,下面就要來實(shí)現(xiàn)客戶端和服務(wù)端了,試試實(shí)驗(yàn)環(huán)境是否能夠正常工作。

服務(wù)端

首先,將虛擬機(jī)(192.168.56.102)作為服務(wù)端,運(yùn)行下面一段代碼創(chuàng)建一個(gè)簡單的socket server,服務(wù)端綁定192.168.56.102:8081:

import sys
from socket import *
HOST = "192.168.56.102"
PORT = 8081
BUFSIZ = 1024
ADDR = (HOST, PORT)
server = socket(AF_INET, SOCK_STREAM)
print "Socket created"
try:
server.bind(ADDR)
except error, msg:
print 'Bind failed. Error Code : ' + str(msg[0]) + ' Message ' + msg[1]
sys.exit()
server.listen(10)
print 'Socket now listening'
while True:
conn, addr = server.accept()
try:
data = conn.recv(100)
if data:
print data
except Exception, e:
print e
conn.close()

客戶端

客戶端的實(shí)現(xiàn)在本機(jī)(192.168.56.101),使用一段基于Pcap.Net的代碼向服務(wù)器發(fā)送一個(gè)[SYN]包(TCP連接建立需要進(jìn)行三次握手,[SYN]包就是***個(gè)握手包),來請(qǐng)求建立TCP連接。

在客戶端代碼中,通過Pcap.Net實(shí)現(xiàn)了兩個(gè)工具函數(shù),一個(gè)用來獲取本機(jī)網(wǎng)卡設(shè)備列表,一個(gè)用在構(gòu)造不同類型的TPC包。

獲取本機(jī)網(wǎng)卡設(shè)備列表代碼:

public static PacketDevice GetNICDevice()
{
// Retrieve the device list from the local machine
IList  allDevices = LivePacketDevice.AllLocalMachine;
if (allDevices.Count == 0)
{
Console.WriteLine("No interfaces found! Make sure WinPcap is installed.");
return null;
}
// Print the device list
for (int i = 0; i != allDevices.Count; ++i)
{
LivePacketDevice device = allDevices[i];
Console.Write((i + 1) + ". " + device.Name);
if (device.Description != null)
Console.WriteLine(" (" + device.Description + ")");
else
Console.WriteLine(" (No description available)");
}
int deviceIndex = 0;
do
{
Console.WriteLine("Enter the interface number (1-" + allDevices.Count + "):");
string deviceIndexString = Console.ReadLine();
if (!int.TryParse(deviceIndexString, out deviceIndex) ||
deviceIndex < 1 || deviceIndex > allDevices.Count)
{
deviceIndex = 0;
}
} while (deviceIndex == 0);
return allDevices[deviceIndex - 1];
}

#p#

另一段重要的代碼就是構(gòu)造TCP包的代碼,根據(jù)OSI七層模型,下面代碼中分別創(chuàng)建了鏈路層、網(wǎng)絡(luò)層和傳輸層的部分,然后生成一個(gè)數(shù)據(jù)包:

public static Packet BuildTcpPacket(EndPointInfo endPointInfo, TcpControlBits tcpControlBits, List tcpOptionList = null)
{
EthernetLayer ethernetLayer =
new EthernetLayer
{
Source = new MacAddress(endPointInfo.SourceMac),
Destination = new MacAddress(endPointInfo.DestinationMac),
EtherType = EthernetType.None, // Will be filled automatically.
};
IpV4Layer ipV4Layer =
new IpV4Layer
{
Source = new IpV4Address(endPointInfo.SourceIp),
CurrentDestination = new IpV4Address(endPointInfo.DestinationIp),
Fragmentation = IpV4Fragmentation.None,
HeaderChecksum = null, // Will be filled automatically.
Identification = 123,
Options = IpV4Options.None,
Protocol = null, // Will be filled automatically.
Ttl = 10,
TypeOfService = 0,
};
TcpLayer tcpLayer =
new TcpLayer
{
SourcePort = endPointInfo.SourcePort,
DestinationPort = endPointInfo.DestinationPort,
Checksum = null, // Will be filled automatically.
SequenceNumber = seqNum,
AcknowledgmentNumber = ackNum,
ControlBits = tcpControlBits,
Window = windowSize,
UrgentPointer = 0,
Options = (tcpOptionList == null) ? TcpOptions.None : new TcpOptions(tcpOptionList),
};
PacketBuilder builder = new PacketBuilder(ethernetLayer, ipV4Layer, tcpLayer);
return builder.Build(DateTime.Now);
}

主程序中,首先配置了客戶端和服務(wù)器的端口、IP/MAC地址信息,然后通過前面兩個(gè)工具函數(shù)構(gòu)造一個(gè)TCP連接建立請(qǐng)求包([SYN]包),并通過"VirtualBox Host-Only Network"網(wǎng)卡發(fā)送給服務(wù)端。

static void Main(string[] args)
{
// Take the selected adapter
PacketDevice selectedDevice = Utils.GetNICDevice();
// Open the output device
using (PacketCommunicator communicator = selectedDevice.Open(System.Int32.MaxValue, // name of the device
PacketDeviceOpenAttributes.Promiscuous, // promiscuous mode
1)) // read timeout
{
EndPointInfo endPointInfo = new EndPointInfo();
endPointInfo.SourceMac = "08:00:27:00:C0:D5";
endPointInfo.DestinationMac = "08:00:27:70:A6:AE";
endPointInfo.SourceIp = "192.168.56.101";
endPointInfo.DestinationIp = "192.168.56.102";
endPointInfo.SourcePort = 3330;
endPointInfo.DestinationPort = 8081;
using (BerkeleyPacketFilter filter = communicator.CreateFilter("tcp port " + endPointInfo.DestinationPort))
{
// Set the filter
communicator.SetFilter(filter);
}
communicator.SendPacket(Utils.BuildTcpPacket(endPointInfo, TcpControlBits.Synchronize, null));
PacketHandler(communicator, endPointInfo);
}
Console.WriteLine("Press Enter to Quit!");
Console.ReadLine();
}
private static void PacketHandler(PacketCommunicator communicator, EndPointInfo endPointInfo)
{
Packet packet = null;
do
{
PacketCommunicatorReceiveResult result = communicator.ReceivePacket(out packet);
switch (result)
{
case PacketCommunicatorReceiveResult.Timeout:
// Timeout elapsed
continue;
case PacketCommunicatorReceiveResult.Ok:
Utils.PacketInfoPrinter(packet);
break;
default:
throw new InvalidOperationException("The result " + result + " should never be reached here");
}
} while (true);
}

#p#

運(yùn)行代碼

代碼完成了,下面看看運(yùn)行效果,為了直觀的看到數(shù)據(jù)包的傳輸,這是就可以打開Wireshark了。

為了避免抓到不相關(guān)的數(shù)據(jù)包,可以設(shè)置Wireshark中的filter,然后開始抓取。

 

下面運(yùn)行代碼,并選擇正確的網(wǎng)卡。通過console和Wireshark的輸出可以看到,我們成功的生產(chǎn)了一個(gè)[SYN]包并發(fā)送到了服務(wù)器。

根據(jù)TCP連接建立過程可以知道,客戶端發(fā)送[SYN]包后,期待從服務(wù)器得到一個(gè)[SYN, ACK]包。

到這里,說明前面搭建的環(huán)境,以及客戶端和服務(wù)端的代碼都是可以正常工作的了。

 

 

誰的[RST]包

從上面的結(jié)果中看到,客戶端在收到[SYN, ACK]包之后,發(fā)送了一個(gè)[RST]包重置這條TCP連接。

仔細(xì)查看了代碼發(fā)現(xiàn),客戶端的代碼中并沒有發(fā)送[RST]包。那么這個(gè)[RST]包是哪里來的呢?

操作系統(tǒng)中有協(xié)議棧的概念,所以來自應(yīng)用層的數(shù)據(jù),都會(huì)一層層的經(jīng)過操作系統(tǒng)協(xié)議棧處理,然后通過網(wǎng)卡發(fā)送出去。

 

當(dāng)客戶端網(wǎng)卡收到[SYN, ACK]包后,這個(gè)包會(huì)被我們的Pcap.Net程序捕獲,也會(huì)被傳送給客戶端操作系統(tǒng)。由于通過Pcap.Net構(gòu)造的[SYN]包是沒有經(jīng)過操作系統(tǒng)協(xié)議棧的,所以操作系統(tǒng)會(huì)認(rèn)為[SYN, ACK]包是一個(gè)無效TCP包,并通過[RST]包重置TCP連接。

到這里,多余[RST]包就可以解釋了。

避免[RST]包

為了避免操作系統(tǒng)協(xié)議棧對(duì)Pcap.Net程序的影響,通過IP安全策略(通過Run->"secpol.msc"打開設(shè)置)的設(shè)置,可以避免操作系統(tǒng)從本機(jī)(192.168.56.101)向虛擬機(jī)(192.168.56.102)發(fā)送數(shù)據(jù)包。

 

設(shè)置完成后,再次運(yùn)行程序,這是程序就正常了。

由于客戶端沒有發(fā)送[ACK]包來確認(rèn)來自服務(wù)端的[SYN, ACK]包,根據(jù)TCP工作原理,服務(wù)端會(huì)進(jìn)行重傳。

 

 

總結(jié)

本文中介紹了TCP實(shí)驗(yàn)環(huán)境的搭建,通過Pcap.Net創(chuàng)建了一個(gè)客戶端,可以構(gòu)造不同類型的TCP數(shù)據(jù)包,并通過特定網(wǎng)卡向服務(wù)器發(fā)送。

后面繼續(xù)基于這個(gè)環(huán)境來看看TCP的一些基本概念,TCP連接、狀態(tài)變遷等等。

責(zé)任編輯:何妍 來源: 博客園
相關(guān)推薦

2015-10-13 15:09:31

2015-10-09 13:15:03

TCP網(wǎng)絡(luò)協(xié)議

2015-10-14 09:44:55

TCP網(wǎng)絡(luò)協(xié)議數(shù)據(jù)傳輸

2015-10-15 09:38:48

TCP網(wǎng)絡(luò)協(xié)議定時(shí)器

2015-10-12 08:33:06

TCP網(wǎng)絡(luò)協(xié)議服務(wù)端

2015-10-10 09:51:51

TCP網(wǎng)絡(luò)協(xié)議客戶端

2018-07-10 15:15:11

2020-05-20 13:53:41

HTTP環(huán)境安裝

2023-07-10 08:43:53

SpringIDEA

2010-06-07 17:33:14

Linux測(cè)試環(huán)境搭建

2011-09-13 15:26:25

MTK環(huán)境搭建

2011-03-21 11:33:09

LAMPApache

2011-03-21 11:43:45

LAMPPHP

2022-12-05 13:59:52

Zabbix 6開源

2011-07-22 18:13:59

IOS IDE Xcode

2012-08-22 10:18:03

PHP

2010-09-01 08:57:18

DHCP實(shí)驗(yàn)

2010-05-28 09:58:00

Linux測(cè)試環(huán)境搭建

2020-06-24 11:32:28

網(wǎng)絡(luò)安全網(wǎng)絡(luò)安全技術(shù)周刊

2009-06-30 14:27:02

JSP入門
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 伊人青青久久 | 国产亚洲精品精品国产亚洲综合 | 午夜精品视频在线观看 | 怡红院免费的全部视频 | 国产精品国产三级国产aⅴ无密码 | 999精彩视频 | 超碰激情 | 国产免费福利小视频 | 亚洲一区视频在线 | 久久免费香蕉视频 | av网站免费看 | 欧美精品久久一区 | 精品久久久久久国产 | 精品1区 | 亚av在线 | 香蕉大人久久国产成人av | 99精品网 | www.成人久久 | 天堂av中文 | 精品国产一区二区国模嫣然 | 欧美久久一级特黄毛片 | 福利影院在线看 | 欧美日韩综合一区 | 精品久久久av | 91精品国产综合久久久久久丝袜 | 成年人在线电影 | 精品网站999www | 一二三四在线视频观看社区 | 免费的黄色片子 | 2019天天干夜夜操 | 麻豆一区二区三区精品视频 | 亚洲成人一区 | 一区二区三区免费在线观看 | 视频一二区 | 99久久精品免费看国产免费软件 | 日韩美女在线看免费观看 | 最新中文字幕一区 | 国产精品久久久久久久久久久久久久 | 欧美成人免费 | 久草精品视频 | 国产日韩欧美激情 |