国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

動(dòng)手學(xué)習(xí)TCP系列之服務(wù)端狀態(tài)變遷

網(wǎng)絡(luò) 網(wǎng)絡(luò)管理
上一篇文章介紹了TCP狀態(tài)機(jī),并且通過(guò)實(shí)驗(yàn)了解了TCP客戶端正常的狀態(tài)變遷過(guò)程。那么,本篇文章就一起看看TCP服務(wù)端的正常狀態(tài)變遷過(guò)程。

上一篇文章介紹了TCP狀態(tài)機(jī),并且通過(guò)實(shí)驗(yàn)了解了TCP客戶端正常的狀態(tài)變遷過(guò)程。

那么,本篇文章就一起看看TCP服務(wù)端的正常狀態(tài)變遷過(guò)程。

服務(wù)端狀態(tài)變遷

根據(jù)上一篇文章中的TCP狀態(tài)變遷圖,可以得到服務(wù)器的正常狀態(tài)變遷流程如下:

CLOSED -> LISTEN -> SYN_RECV -> ESTABLISHED -> CLOSE_WAIT -> LAST_ACK -> CLOSED

服務(wù)端狀態(tài)變遷實(shí)驗(yàn)

下面就結(jié)合上面分析出來(lái)的服務(wù)端狀態(tài)變遷表,利用Pcap.Net來(lái)模擬服務(wù)端正常的狀態(tài)變遷過(guò)程。

代碼實(shí)現(xiàn)

跟前面幾次正好相反,這次我們將在宿主機(jī)運(yùn)行Pcap.Net實(shí)現(xiàn)的服務(wù)端,然后在虛擬機(jī)運(yùn)行一個(gè)客戶端。

對(duì)于服務(wù)端,主程序中設(shè)置了源和目的端的連接信息,這次宿主機(jī)中的服務(wù)端將監(jiān)聽“3333”端口。

然后,程序中設(shè)置了服務(wù)端TCP初始狀態(tài)為"LISTENING",然后就直接運(yùn)行監(jiān)聽函數(shù)了。

// 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 = "";
endPointInfo.SourceIp = "192.168.56.101";
endPointInfo.DestinationIp = "";
endPointInfo.SourcePort = 3333;
endPointInfo.DestinationPort = 0;
using (BerkeleyPacketFilter filter = communicator.CreateFilter("tcp port " + endPointInfo.SourcePort))
{
// Set the filter
communicator.SetFilter(filter);
}
tcpStatus = TCPStatus.LISTENING;
PacketHandler(communicator, endPointInf)
}
這次的監(jiān)聽函數(shù)"PacketHandler"中的邏輯,跟上一次客戶端的例子還是有很大差別的。

首先是期待接收和實(shí)際發(fā)送的TCP包類型有很大的差別,其次就是狀態(tài)之間的變遷是完全不同的。但是,代碼的邏輯依然是根據(jù)上面的服務(wù)端狀態(tài)變遷表。

private static void PacketHandler(PacketCommunicator communicator, EndPointInfo endPointInfo)
{
Packet packet = null;
bool running = true;
do{
PacketCommunicatorReceiveResult result = communicator.ReceivePacket(out packet);
switch (result)
{
case PacketCommunicatorReceiveResult.Timeout:
// Timeout elapsed
continue;
case PacketCommunicatorReceiveResult.Ok:
bool isRecvedPacket = (packet.Ethernet.IpV4.Destination.ToString() == endPointInfo.SourceIp) ? true : false;
if (isRecvedPacket)
{
switch (packet.Ethernet.IpV4.Tcp.ControlBits){
case TcpControlBits.Synchronize:
if (tcpStatus == TCPStatus.LISTENING)
{
endPointInfo.DestinationMac = packet.Ethernet.Source.ToString();
endPointInfo.DestinationIp = packet.Ethernet.IpV4.Source.ToString();
endPointInfo.DestinationPort = packet.Ethernet.IpV4.Tcp.SourcePort;
Utils.PacketInfoPrinter(packet);
Packet synAck = Utils.BuildTcpResponsePacket(packet, TcpControlBits.Synchronize | TcpControlBits.Acknowledgment);
communicator.SendPacket(synAck);
tcpStatus = TCPStatus.SYN_RECEIVED;
}break;
case TcpControlBits.Acknowledgment:
if (tcpStatus == TCPStatus.SYN_RECEIVED)
{
tcpStatus = TCPStatus.ESTABLISHED;
Utils.PacketInfoPrinter(packet, tcpStatus);
}
else if (tcpStatus == TCPStatus.LAST_ACK)
{
tcpStatus = TCPStatus.CLOSED;
Utils.PacketInfoPrinter(packet, tcpStatus);
tcpStatus = TCPStatus.LISTENING;
}
else if (tcpStatus == TCPStatus.FIN_WAIT_1)
{
tcpStatus = TCPStatus.FIN_WAIT_2;
Utils.PacketInfoPrinter(packet);
}
break;
case (TcpControlBits.Fin | TcpControlBits.Acknowledgment):
if (tcpStatus == TCPStatus.FIN_WAIT_2)
{
Utils.PacketInfoPrinter(packet);
Packet ack = Utils.BuildTcpResponsePacket(packet, TcpControlBits.Acknowledgment);
communicator.SendPacket(ack);
tcpStatus = TCPStatus.TIME_WAIT;
}
else if (tcpStatus == TCPStatus.ESTABLISHED){
Utils.PacketInfoPrinter(packet);
Packet ack = Utils.BuildTcpResponsePacket(packet, TcpControlBits.Acknowledgment);
communicator.SendPacket(ack);
tcpStatus = TCPStatus.CLOSE_WAIT;
}
break;
default:
Utils.PacketInfoPrinter(packet);
break;
}
}
else
{
switch (packet.Ethernet.IpV4.Tcp.ControlBits)
{
case (TcpControlBits.Synchronize | TcpControlBits.Acknowledgment):
if (tcpStatus == TCPStatus.SYN_RECEIVED)
{
Utils.PacketInfoPrinter(packet, tcpStatus);
}
#p#
break;
case (TcpControlBits.Fin | TcpControlBits.Acknowledgment):
if (tcpStatus == TCPStatus.FIN_WAIT_1)
{
Utils.PacketInfoPrinter(packet, tcpStatus);
}
else if (tcpStatus == TCPStatus.LAST_ACK)
{
Utils.PacketInfoPrinter(packet, tcpStatus);
}
break;
case TcpControlBits.Acknowledgment:
if (tcpStatus == TCPStatus.TIME_WAIT)
{
Utils.PacketInfoPrinter(packet, tcpStatus);
}else if (tcpStatus == TCPStatus.CLOSE_WAIT)
{
Utils.PacketInfoPrinter(packet, tcpStatus);
Packet fin = Utils.BuildTcpPacket(endPointInfo, TcpControlBits.Fin | TcpControlBits.Acknowledgment);
communicator.SendPacket(fin);
tcpStatus = TCPStatus.LAST_ACK;
}break;
default:
Utils.PacketInfoPrinter(packet);
break;
}
}
break;
default:
throw new InvalidOperationException("The result " + result + " should never be reached here");
}
} while (running);
}

對(duì)于客戶端,通過(guò)Python實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的Socket程序來(lái)模擬客戶端行為:

 

from socket import *
import time
HOST = "192.168.56.101"
PORT = 3333
BUFSIZ = 1024
ADDR = (HOST, PORT)
client = socket(AF_INET, SOCK_STREAM)
client.connect(ADDR)
time.sleep(5)
client.close()

 

運(yùn)行效果

這次,宿主機(jī)上運(yùn)行的是服務(wù)端,虛擬機(jī)運(yùn)行的是客戶端,打開Wireshark監(jiān)聽"VirtualBox Host-Only Network"網(wǎng)卡,并設(shè)置filter為"port 3333"。

運(yùn)行服務(wù)端程序,服務(wù)端將處于監(jiān)聽狀態(tài)。這是在虛擬機(jī)中運(yùn)行"client.py"。這時(shí),通過(guò)服務(wù)端console可以看到客戶端和服務(wù)端之間的包,以及服務(wù)端的狀態(tài)變遷。

 

Wireshark依然顯示的是TCP連接建立和終止的過(guò)程。

 

netstat命令

netstat是控制臺(tái)命令,是一個(gè)監(jiān)控TCP/IP網(wǎng)絡(luò)的非常有用的工具,它可以顯示路由表、實(shí)際的網(wǎng)絡(luò)連接以及每一個(gè)網(wǎng)絡(luò)接口設(shè)備的狀態(tài)信息。netstat用于顯示與IP、TCP、UDP和ICMP協(xié)議相關(guān)的統(tǒng)計(jì)數(shù)據(jù),一般用于檢驗(yàn)本機(jī)各端口的網(wǎng)絡(luò)連接情況。

實(shí)驗(yàn)中的宿主機(jī)系統(tǒng)是Win7,下面看看通過(guò) netatat /? 獲得的幫助信息:

 

netstat命令失效?

雖然說(shuō)上面的程序可以打印出服務(wù)端的狀態(tài)變遷過(guò)程,但是這次讓我們通過(guò)netstat命令查看一下。

為了方便查看,將"client.py"中的"time.sleep(5)"改為"time.sleep(300)",使客戶端跟服務(wù)器之間的連接保持300秒。客戶端的端口號(hào)為"1090"。

 

這時(shí),分別在服務(wù)端和客戶端cmd窗口中執(zhí)行 netstat -anp TCP | findstr "192.168.56" 命令,查看包含"192.168.56"字符串的TCP連接:

服務(wù)端:

 

客戶端:

 

為什么服務(wù)端看不到TCP連接?就像我們***篇介紹的那樣,Pcap.Net是不經(jīng)過(guò)操作系統(tǒng)協(xié)議棧的,所以這也就解釋了為什么"netstat"命令發(fā)現(xiàn)不了服務(wù)端的TCP連接。

等300秒結(jié)束后,客戶端會(huì)發(fā)送終止連接請(qǐng)求。當(dāng)連接終止后,可以看大客戶端的TCP連接狀態(tài)變成了"TIME_WAIT"。

客戶端:

 

總結(jié)

本文中根據(jù)TCP狀態(tài)變遷圖,得到了服務(wù)端的狀態(tài)變遷表。

然后使用Pcap.Net,基于服務(wù)端的狀態(tài)變遷表,構(gòu)建了一個(gè)簡(jiǎn)單的服務(wù)端,展示了服務(wù)端狀態(tài)變遷的過(guò)程。

文中還簡(jiǎn)單的介紹了"netstat"命令,通過(guò)這個(gè)命令可以查看TCP連接的狀態(tài),結(jié)合這個(gè)命令,可以更好的了解TCP狀態(tài)。

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

2015-10-10 09:51:51

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

2015-10-13 15:09:31

2015-10-08 14:03:01

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

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í)器

2022-05-08 17:53:38

Nacos服務(wù)端客戶端

2023-08-14 08:17:13

Kafka服務(wù)端

2016-03-18 09:04:42

swift服務(wù)端

2014-09-19 09:46:46

TCPIP

2022-09-05 14:36:26

服務(wù)端TCP連接

2012-03-02 10:38:33

MySQL

2013-03-25 10:08:44

PHPWeb

2022-05-22 13:55:30

Go 語(yǔ)言

2021-06-30 06:59:47

Zabbix Server服務(wù)端MySQL

2010-08-03 09:59:30

NFS服務(wù)

2016-11-03 09:59:38

kotlinjavaspring

2021-05-25 08:20:37

編程技能開發(fā)

2020-03-31 20:23:46

C語(yǔ)言TCP服務(wù)器

2022-08-13 13:05:43

TCP服務(wù)端四次揮手
點(diǎn)贊
收藏

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

久久精品99国产精品酒店日本| 在线视频亚洲欧美中文| 欧美绝顶高潮抽搐喷水合集| 精品福利在线观看| 成人免费看片网站| 国产精品chinese在线观看| 91精品国产91热久久久做人人| 国产精品-区区久久久狼| 欧美精品aa| 久久精品久久久久久| 日本亚洲精品| 亚洲色图欧美激情| 丰满的少妇愉情hd高清果冻传媒| 不卡中文字幕| 日韩**中文字幕毛片| 国产私拍福利精品视频二区| 黄色一区二区在线| 在线看视频你懂的| 在线播放中文字幕一区| 九九99久久| 伊人久久国产| 视频一区视频二区中文字幕| 国产精品久久久久久久久果冻传媒| 欧洲美女7788成人免费视频| 在线天堂新版最新版在线8| 不卡欧美aaaaa| 亚洲国产精品123| 少女频道在线观看高清 | 欧美激情欧美| 一区二区三区四区蜜桃| 97精品国产97久久久久久免费 | 免费av高清| 欧美3p视频在线观看| 久久一夜天堂av一区二区三区| 欧美国产视频一区| 国产喂奶挤奶一区二区三区| 久久99久久久久久| 国产欧美日韩另类视频免费观看 | 欧美性生活一级片| 精品国产一区二区在线观看| 91久热免费在线视频| 国产乱人伦丫前精品视频| 91精品视频在线免费观看| 中文日韩在线| 黄大色黄女片18第一次| 欧美军同video69gay| 日韩成人18| 亚洲在线视频观看| 91麻豆国产精品久久| 黄色网址在线播放| 日韩精品视频免费在线观看| 日韩精品永久网址| 一级毛片高清视频| 最新国产精品久久精品| 激情深爱综合网| 蜜臀久久99精品久久一区二区| 欧美日韩亚洲综合在线 欧美亚洲特黄一级 | 一区二区三区 日韩| 香蕉久久a毛片| 欧美精品中文字幕一区| 日本一区高清| 欧美xxxxxxxxx| 日本欧美不卡| 青青草成人激情在线| 亚洲欧美另类久久久精品2019| 91黄页在线观看| 精品国产一区二区三区久久久久久| 国产精品正在播放| 国产丝袜在线| 91视频免费在线观看| 欧美三级网页| 乱小说综合网站| 中文字幕日韩av综合精品| 亚洲日韩成人| 久久久久99精品国产片| 波多野在线观看| 国语自产精品视频在线看抢先版图片 | 色综合一区二区日本韩国亚洲 | 国产一级不卡毛片| 一区二区三区在线免费播放| www.夜夜爱| 亚洲激情国产| 四虎永久在线精品无码视频| 精品久久99ma| 久久亚洲欧美| 中国色在线日|韩| 91国在线精品国内播放| 久久精品二区亚洲w码| 国语对白在线刺激| 国产成人亚洲综合无码| 精品国产拍在线观看| 欧美激情综合在线| 欧美日韩有码| 黄色网页网址在线免费| 亚洲欧洲另类精品久久综合| 欧美电影免费提供在线观看| 七七婷婷婷婷精品国产| 欧美高清另类hdvideosexjaⅴ| 精品久久蜜桃| 最新亚洲国产| 欧美性xxxx69| 亚洲一区二区黄| 不卡大黄网站免费看| 国产一区电影| av在线免费观看国产| 久久6免费高清热精品| 久久综合久色欧美综合狠狠| 国产a亚洲精品| 韩国av电影免费观看| 久久99蜜桃综合影院免费观看| 日韩国产在线播放| 国产亚洲成av人在线观看导航| 蜜桃传媒视频麻豆第一区免费观看 | 国内一区二区在线| 精品欧美午夜寂寞影院| 在线观影网站| 亚洲激情免费视频| 国产一区香蕉久久| 中文字幕av一区二区| 2021久久国产精品不只是精品| 国语精品视频| 好看的中文字幕在线播放 | 99麻豆久久久国产精品免费| 欧美精品99| 精品中文一区| 精品视频在线一区二区在线| 成在在线免费视频| 国产理论在线播放| 欧美综合国产精品久久丁香| 色婷婷久久久久swag精品| 亚洲伊人观看| 欧美精品三区| 久久中文字幕导航| 欧美成人xxxx| 久草在线资源视频在线观看| 国产精品一区二区三区四区五区| 日韩欧美的一区二区| 国产成人丝袜美腿| 激情综合久久| 成人噜噜噜噜| 超碰在线网址| 视频在线国产| 黄色一级在线视频| 成人免费a级片| 精品少妇人欧美激情在线观看| 一区在线电影| 国产精品三区在线| 97久久精品在线| 在线激情影院一区| 亚洲天堂影视av| 亚洲精品美女久久久| 国产伊人精品| 日韩成人精品| 国产美女亚洲精品7777| 日韩精品成人在线观看| 国产盗摄精品一区二区酒店| 凹凸国产熟女精品视频| 久久国产成人精品国产成人亚洲| 欧美日本亚洲| 九色综合婷婷综合| 91久久精品www人人做人人爽 | 国产对白叫床清晰在线播放| 欧美黄网站在线观看| www.com操| av大片在线观看| 老司机福利在线视频| 亚洲视频自拍| 91精品婷婷色在线观看| 日本网站在线观看一区二区三区| 国产精品五区| 日日夜夜精品视频免费| 国产激情视频一区二区在线观看| 91免费观看国产| 日韩欧美电影在线| 亚洲精品久久久久久久久久久久久| 久久精品国产96久久久香蕉| 国产精品日韩在线观看| 日韩中文字幕一区| 国产视频在线观看一区| 亚洲欧美中文在线视频| 色天天综合久久久久综合片| 亚洲成色777777在线观看影院| 精品视频在线观看免费观看| 欧美精品国产| 欧美三级网页| 久久久人人人| 精品国产电影一区| www亚洲欧美| 欧美日韩高清在线观看| 久久久最新网址| 精品国产污污免费网站入口 | 日韩欧美一区二区三区久久| 在线观看亚洲精品| 亚洲另类xxxx| 亚洲aⅴ男人的天堂在线观看| 免费在线观看毛片网站| 久草在线青青草| 久久人人爽人人爽人人片av不| 精品精品99| 一区二区三区中文在线观看|