国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

探究Go語(yǔ)言如何實(shí)現(xiàn)簡(jiǎn)易版netstat命令

阿銘linux ? 來(lái)源:杰哥的IT之旅 ? 作者: 杰哥的IT之旅 ? 2021-07-27 10:35 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

netstat 使用 go 語(yǔ)言實(shí)現(xiàn)是什么操作?本文從 netstat 原理出發(fā)詳細(xì)解讀了這一實(shí)踐。

netstat 工作原理

netstat 命令是 linux 系統(tǒng)中查看網(wǎng)絡(luò)情況的一個(gè)命令。比如我們可以通過(guò)netstat -ntlp | grep 8080查看監(jiān)聽 8080 端口的進(jìn)程。

17f98660-e3ff-11eb-a97a-12bb97331649.jpg

netstat 工作原理如下:

通過(guò)讀取/proc/net/tcp 、/proc/net/tcp6 文件,獲取 socket 本地地址,本地端口,遠(yuǎn)程地址,遠(yuǎn)程端口,狀態(tài),inode 等信息

接著掃描所有/proc/[pid]/fd 目錄下的的 socket 文件描述符,建立 inode 到進(jìn)程 pid 映射

根據(jù) pid 讀取/proc/[pid]/cmdline 文件,獲取進(jìn)程命令和啟動(dòng)參數(shù)

根據(jù) 2,3 步驟,即可以獲得 1 中對(duì)應(yīng) socket 的相關(guān)進(jìn)程信息

我們可以做個(gè)測(cè)試驗(yàn)證整個(gè)流程。先使用 nc 命令監(jiān)聽 8090 端口:

nc -l 8090

找到上面 nc 進(jìn)程的 pid,查看該進(jìn)程所有打開的文件描述符:

vagrant@vagrant:/proc/25556/fd$ ls -alh

total 0

dr-x------ 2 vagrant vagrant 0 Nov 18 12:21 。

dr-xr-xr-x 9 vagrant vagrant 0 Nov 18 12:20 。。

lrwx------ 1 vagrant vagrant 64 Nov 18 12:21 0 -》 /dev/pts/1

lrwx------ 1 vagrant vagrant 64 Nov 18 12:21 1 -》 /dev/pts/1

lrwx------ 1 vagrant vagrant 64 Nov 18 12:21 2 -》 /dev/pts/1

lrwx------ 1 vagrant vagrant 64 Nov 18 12:21 3 -》 socket:[2226056]

上面列出的所有文件描述中,socket:[2226056]為 nc 命令監(jiān)聽 8090 端口所創(chuàng)建的 socket。其中2226056為該 socket 的 inode。

根據(jù)該 inode 號(hào),我們查看/proc/net/tcp對(duì)應(yīng)的記錄信息,其中1F9A為本地端口號(hào),轉(zhuǎn)換成十進(jìn)制恰好為 8090:

vagrant@vagrant:/proc/25556/fd$ cat /proc/net/tcp | grep 2226056

1: 00000000:1F9A 00000000:0000 0A 00000000:00000000 00:00000000 00000000 1000 0 2226056 1 0000000000000000 100 0 0 10 0

根據(jù)進(jìn)程 id,我們查看進(jìn)程名稱和啟動(dòng)參數(shù):

vagrant@vagrant:/proc/25556/fd$ cat /proc/25556/cmdline

nc-l8090

下面我們看下/proc/net/tcp文件格式。

/proc/net/tcp 文件格式

/proc/net/tcp文件首先會(huì)列出所有監(jiān)聽狀態(tài)的 TCP 套接字,然后列出所有已建立的 TCP 套接字。我們通過(guò)head -n 5 /proc/net/tcp命令查看該文件頭五行:

sl local_address rem_address st tx_queue rx_queue tr tm-》when retrnsmt uid timeout inode

0: 0100007F:0019 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 22279 1 0000000000000000 100 0 0 10 0

1: 00000000:1FBB 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 21205 1 0000000000000000 100 0 0 10 0

2: 00000000:26FB 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 21203 1 0000000000000000 100 0 0 10 0

3: 00000000:26FD 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 21201 1 0000000000000000 100 0 0 10 0

每一行各個(gè)字段解釋說(shuō)明如下,由于太長(zhǎng)分為三部分說(shuō)明:

第一部分:

46: 010310AC:9C4C 030310AC:1770 01

| | | | | |--》 連接狀態(tài),16 進(jìn)制表示,具體值見下面說(shuō)明

| | | | |------》 遠(yuǎn)程 TCP 端口號(hào),主機(jī)字節(jié)序,16 進(jìn)制表示

| | | |-------------》 遠(yuǎn)程 IPv4 地址,網(wǎng)絡(luò)字節(jié)序,16 進(jìn)制表示

| | |--------------------》 本地 TCP 端口號(hào),主機(jī)字節(jié)序,16 進(jìn)制表示

| |---------------------------》 本地 IPv4 地址,網(wǎng)絡(luò)字節(jié)序,16 進(jìn)制表示

|----------------------------------》 條目編號(hào),從 0 開始

上面連接狀態(tài)所有值如下,具體參見 linux 源碼 tcp\_states.h[1]:

enum {

TCP_ESTABLISHED = 1,

TCP_SYN_SENT,

TCP_SYN_RECV,

TCP_FIN_WAIT1,

TCP_FIN_WAIT2,

TCP_TIME_WAIT,

TCP_CLOSE,

TCP_CLOSE_WAIT,

TCP_LAST_ACK,

TCP_LISTEN,

TCP_CLOSING, /* Now a valid state */

TCP_NEW_SYN_RECV,

TCP_MAX_STATES /* Leave at the end! */

};

第二部分:

00000150:00000000 01:00000019 00000000

| | | | |--》 number of unrecovered RTO timeouts

| | | |----------》 number of jiffies until timer expires

| | |----------------》 timer_active,具體值見下面說(shuō)明

| |----------------------》 receive-queue,當(dāng)狀態(tài)是 ESTABLISHED,表示接收隊(duì)列中數(shù)據(jù)長(zhǎng)度;狀態(tài)是 LISTEN,表示已經(jīng)完成連接隊(duì)列的長(zhǎng)度

|-------------------------------》 transmit-queue,發(fā)送隊(duì)列中數(shù)據(jù)長(zhǎng)度

timer_active 所有值與說(shuō)明如下:

0 no timer is pending

1 retransmit-timer is pending

2 another timer (e.g. delayed ack or keepalive) is pending

3 this is a socket in TIME_WAIT state. Not all fields will contain data (or even exist)

4 zero window probe timer is pending

第三部分:

1000 0 54165785 4 cd1e6040 25 4 27 3 -1

| | | | | | | | | |--》 slow start size threshold,

| | | | | | | | | or -1 if the threshold

| | | | | | | | | is 》= 0xFFFF

| | | | | | | | |----》 sending congestion window

| | | | | | | |-------》 (ack.quick《《1)|ack.pingpong

| | | | | | |---------》 Predicted tick of soft clock

| | | | | | (delayed ACK control data)

| | | | | |------------》 retransmit timeout

| | | | |------------------》 location of socket in memory

| | | |-----------------------》 socket reference count

| | |-----------------------------》 socket 的 inode 號(hào)

| |----------------------------------》 unanswered 0-window probes

|---------------------------------------------》 socket 所屬用戶的 uid

Go 實(shí)現(xiàn)簡(jiǎn)易版本 netstat 命令

netstat 工作原理和/proc/net/tcp文件結(jié)構(gòu),我們都已經(jīng)了解了,現(xiàn)在可以使用據(jù)此使用 Go 實(shí)現(xiàn)一個(gè)簡(jiǎn)單版本的 netstat 命令。

18041148-e3ff-11eb-a97a-12bb97331649.jpg

核心代碼如下,完整代碼參加 go-netstat[2]:

// 狀態(tài)碼值const (

TCP_ESTABLISHED = iota + 1

TCP_SYN_SENT

TCP_SYN_RECV

TCP_FIN_WAIT1

TCP_FIN_WAIT2

TCP_TIME_WAIT

TCP_CLOSE

TCP_CLOSE_WAIT

TCP_LAST_ACK

TCP_LISTEN

TCP_CLOSING

//TCP_NEW_SYN_RECV

//TCP_MAX_STATES

// 狀態(tài)碼var states = map[int]string{

TCP_ESTABLISHED: “ESTABLISHED”,

TCP_SYN_SENT: “SYN_SENT”,

TCP_SYN_RECV: “SYN_RECV”,

TCP_FIN_WAIT1: “FIN_WAIT1”,

TCP_FIN_WAIT2: “FIN_WAIT2”,

TCP_TIME_WAIT: “TIME_WAIT”,

TCP_CLOSE: “CLOSE”,

TCP_CLOSE_WAIT: “CLOSE_WAIT”,

TCP_LAST_ACK: “LAST_ACK”,

TCP_LISTEN: “LISTEN”,

TCP_CLOSING: “CLOSING”,

//TCP_NEW_SYN_RECV: “NEW_SYN_RECV”,

//TCP_MAX_STATES: “MAX_STATES”,

}

// socketEntry 結(jié)構(gòu)體,用來(lái)存儲(chǔ)/proc/net/tcp 每一行解析后數(shù)據(jù)信息type socketEntry struct {

id int

srcIP net.IP

srcPort int

dstIP net.IP

dstPort int

state string

txQueue int

rxQueue int

timer int8

timerDuration time.Duration

rto time.Duration // retransmission timeout

uid int

uname string

timeout time.Duration

inode string

}

// 解析/proc/net/tcp 行記錄func parseRawSocketEntry(entry string) (*socketEntry, error) {

se := &socketEntry{}

entrys := strings.Split(strings.TrimSpace(entry), “ ”)

entryItems := make([]string, 0, 17)

for _, ent := range entrys {

if ent == “” {

continue

}

entryItems = append(entryItems, ent)

}

id, err := strconv.Atoi(string(entryItems[0][:len(entryItems[0])-1]))

if err != nil {

return nil, err

}

se.id = id // sockect entry id

localAddr := strings.Split(entryItems[1], “:”) // 本地 ip

se.srcIP = parseHexBigEndianIPStr(localAddr[0])

port, err := strconv.ParseInt(localAddr[1], 16, 32) // 本地 port

if err != nil {

return nil, err

}

se.srcPort = int(port)

remoteAddr := strings.Split(entryItems[2], “:”) // 遠(yuǎn)程 ip

se.dstIP = parseHexBigEndianIPStr(remoteAddr[0])

port, err = strconv.ParseInt(remoteAddr[1], 16, 32) // 遠(yuǎn)程 port

if err != nil {

return nil, err

}

se.dstPort = int(port)

state, _ := strconv.ParseInt(entryItems[3], 16, 32) // socket 狀態(tài)

se.state = states[int(state)]

tcpQueue := strings.Split(entryItems[4], “:”)

tQueue, err := strconv.ParseInt(tcpQueue[0], 16, 32) // 發(fā)送隊(duì)列數(shù)據(jù)長(zhǎng)度

if err != nil {

return nil, err

}

se.txQueue = int(tQueue)

sQueue, err := strconv.ParseInt(tcpQueue[1], 16, 32) // 接收隊(duì)列數(shù)據(jù)長(zhǎng)度

if err != nil {

return nil, err

}

se.rxQueue = int(sQueue)

se.uid, err = strconv.Atoi(entryItems[7]) // socket uid

if err != nil {

return nil, err

}

se.uname = systemUsers[entryItems[7]] // socket user name

se.inode = entryItems[9] // socket inode

return se, nil

}

// hexIP 是網(wǎng)絡(luò)字節(jié)序/大端法轉(zhuǎn)換成的 16 進(jìn)制的字符串func parseHexBigEndianIPStr(hexIP string) net.IP {

b := []byte(hexIP)

for i, j := 1, len(b)-2; i 《 j; i, j = i+2, j-2 { // 反轉(zhuǎn)字節(jié),轉(zhuǎn)換成小端法

b[i], b[i-1], b[j], b[j+1] = b[j+1], b[j], b[i-1], b[i]

}

l, _ := strconv.ParseInt(string(b), 16, 64)

return net.IPv4(byte(l》》24), byte(l》》16), byte(l》》8), byte(l))

}

編輯:jq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11759

    瀏覽量

    219013

原文標(biāo)題:Go 語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易版 netstat 命令

文章出處:【微信號(hào):aming_linux,微信公眾號(hào):阿銘linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Go 語(yǔ)言高并發(fā)服務(wù)設(shè)計(jì)與性能調(diào)優(yōu)實(shí)戰(zhàn):從萬(wàn)級(jí)到百萬(wàn)級(jí)并發(fā)的演進(jìn)之路

    在2026年的今天,Go 語(yǔ)言已成為高并發(fā)后端服務(wù)的首選語(yǔ)言。根據(jù) Stack Overflow 最新開發(fā)者調(diào)查: 指標(biāo) 數(shù)據(jù) Go 語(yǔ)言
    發(fā)表于 02-18 19:19

    Kubernetes kubectl命令行工具詳解

    kubectl是Kubernetes官方提供的命令行工具,作為與Kubernetes集群交互的主要接口,它通過(guò)調(diào)用Kubernetes API Server實(shí)現(xiàn)對(duì)集群資源的全面管理。在生產(chǎn)環(huán)境中,運(yùn)維工程師需要熟練掌握kubectl命令
    的頭像 發(fā)表于 02-02 16:40 ?415次閱讀

    講解C語(yǔ)言代碼的實(shí)現(xiàn)過(guò)程

    重點(diǎn)講解C語(yǔ)言代碼的實(shí)現(xiàn)過(guò)程,算法的C語(yǔ)言實(shí)現(xiàn)過(guò)程具有一般性,通過(guò)PID算法的C語(yǔ)言實(shí)現(xiàn),可以以此類推,設(shè)計(jì)其它算法的C語(yǔ)言實(shí)現(xiàn)。 第一步:
    發(fā)表于 01-21 07:58

    低成本TLI4971/TLE4971電流傳感器評(píng)估套件——MS2Go與S2Go

    低成本TLI4971/TLE4971電流傳感器評(píng)估套件——MS2Go與S2Go 在電子工程師的日常工作中,電流傳感器的評(píng)估和應(yīng)用是一個(gè)重要的環(huán)節(jié)。今天我們要介紹的是英飛凌(Infineon
    的頭像 發(fā)表于 12-19 16:50 ?831次閱讀

    探索TLE493D-P3XX-MS2GO 3D 2Go套件:開啟3D磁傳感器評(píng)估之旅

    探索TLE493D-P3XX-MS2GO 3D 2Go套件:開啟3D磁傳感器評(píng)估之旅 在電子工程師的日常工作中,評(píng)估和開發(fā)磁傳感器是一項(xiàng)常見且重要的任務(wù)。英飛凌(Infineon
    的頭像 發(fā)表于 12-18 17:15 ?818次閱讀

    房產(chǎn)數(shù)據(jù)平臺(tái)安家go獲取地區(qū)列表數(shù)據(jù)的API接口

    如何使用安家go提供的API接口來(lái)獲取地區(qū)列表數(shù)據(jù),包括API端點(diǎn)、請(qǐng)求參數(shù)、響應(yīng)格式以及代碼實(shí)現(xiàn)。我們將逐步引導(dǎo)您完成整個(gè)過(guò)程,確保您能輕松集成到自己的項(xiàng)目中。 1. API概述 安家go的“獲取地區(qū)列表”API是一個(gè)基于RE
    的頭像 發(fā)表于 11-21 14:38 ?342次閱讀
    房產(chǎn)數(shù)據(jù)平臺(tái)安家<b class='flag-5'>go</b>獲取地區(qū)列表數(shù)據(jù)的API接口

    是德示波器自動(dòng)化測(cè)試SCPI命令控制指南

    是德示波器通過(guò)標(biāo)準(zhǔn)命令接口SCPI(Standard Commands for Programmable Instruments)實(shí)現(xiàn)自動(dòng)化控制,為測(cè)試系統(tǒng)集成與高效調(diào)試提供強(qiáng)大支持。本文結(jié)合其核心
    的頭像 發(fā)表于 09-23 17:54 ?1739次閱讀
    是德示波器自動(dòng)化測(cè)試SCPI<b class='flag-5'>命令</b>控制指南

    Linux基礎(chǔ)命令which詳解

    在Linux系統(tǒng)中,which命令用于查找并顯示指定命令的可執(zhí)行文件路徑。這對(duì)于系統(tǒng)管理員和開發(fā)人員來(lái)說(shuō)是一個(gè)非常有用的工具,可以幫助定位命令所在的位置,確認(rèn)命令是否已正確安裝,并且能
    的頭像 發(fā)表于 07-29 17:58 ?851次閱讀

    【VisionFive 2單板計(jì)算機(jī)試用體驗(yàn)】3、開源大語(yǔ)言模型部署

    github里的build from source指導(dǎo),進(jìn)行編譯,編譯步驟如下圖所示: 在調(diào)用go run . serve發(fā)現(xiàn)抱錯(cuò):go指令不存在,這是因?yàn)閂isionFive2板卡沒(méi)有安裝go,下面我們
    發(fā)表于 07-19 15:45

    無(wú)刷直流電機(jī)電流測(cè)量的探究

    摘要 :近幾年,無(wú)刷直流電機(jī)在工業(yè)控制領(lǐng)域的應(yīng)用越來(lái)越廣泛,而有效的電流測(cè)量是控制方法實(shí)現(xiàn)的前提,也是提高控制性能的基礎(chǔ)。本文基于 TIS320LF2407ADSP 控制器,對(duì)無(wú)刷直流電機(jī)
    發(fā)表于 06-26 13:45

    如何使用Traceroute命令

    以下是如何使用 traceroute 命令的詳細(xì)指南,包括其語(yǔ)法、選項(xiàng)和實(shí)際示例。
    的頭像 發(fā)表于 06-04 11:28 ?2235次閱讀

    Docker Volume管理命令大全

    Docker Volume管理命令大全
    的頭像 發(fā)表于 05-28 17:14 ?893次閱讀

    當(dāng) ccg3pa 收到 pr_swap 命令時(shí),它不會(huì)執(zhí)行 eval_pr_swap 函數(shù),為什么?

    我正在使用 POWER_DRILL2GO sdk - CYPD3171-24LQXQ_pb 項(xiàng)目, 我必須根據(jù)不同的條件設(shè)置不同的響應(yīng)(REJECT或ACCEPT)來(lái) POWER_DRILL2GO
    發(fā)表于 05-26 06:15

    從 Java 到 Go:面向?qū)ο蟮木奕伺c云原生的輕騎兵

    Go 語(yǔ)言在 2009 年被 Google 推出,在創(chuàng)建之初便明確提出了“少即是多(Less is more)”的設(shè)計(jì)原則,強(qiáng)調(diào)“以工程效率為核心,用極簡(jiǎn)規(guī)則解決復(fù)雜問(wèn)題”。它與 Java 語(yǔ)言生態(tài)
    的頭像 發(fā)表于 04-25 11:13 ?644次閱讀

    netstat命令怎么看被監(jiān)控?

    要使用netstat命令查看網(wǎng)絡(luò)連接狀態(tài)并判斷是否被監(jiān)控,可以參考以下步驟和命令: 1、查看所有監(jiān)聽端口 使用以下命令查看系統(tǒng)上所有監(jiān)聽的端口及其對(duì)應(yīng)的進(jìn)程: sudo
    的頭像 發(fā)表于 04-16 20:36 ?2096次閱讀