日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux中通过Socket文件描述符寻找连接状态介绍

發布時間:2023/12/10 linux 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux中通过Socket文件描述符寻找连接状态介绍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

針對下文的總結:socket是一種文件描述符

進程的打開文件描述符表

Linux的三個系統調用:open,socket,pipe 返回的都是一個描述符。不同的進程中,他們返回的描述符可以相同。那么,在同一個進程中,他們可以相同嗎?或者說,普通文件、套接字和管道,這三者的描述符屬于同一個集合嗎?

在內核源碼中,三個系統調用聲明如下:

  • SYSCALL_DEFINE3(open,?const?char?__user?*,?filename,?int,?flags,?umode_t,?mode);??
  • SYSCALL_DEFINE3(socket,?int,?family,?int,?type,?int,?protocol);??
  • SYSCALL_DEFINE1(pipe,?int?__user?*,?fildes); ?
  • 他們都會先后調用函數

    • get_unused_fd_flags:獲取當前進程打開文件描述符表中的空閑描述符;
    • fd_install:安裝新描述符到當前進程打開文件描述符表。

    內核為每個進程維護了一個結構體struct task_struct,可稱為進程表項、進程控制塊(PCB: Process Control Block)或者進程描述符,定義如下:

  • struct?task_struct?{??
  • ????????volatile?long?state;??/*?-1?unrunnable,?0?runnable,>0?stopped?*/??
  • ????????…??
  • ????????pid_t?pid;??
  • ????????…??
  • ????????struct?files_struct?*files;??
  • ????????…??
  • }; ?
  • 其中files成員成為打開文件描述符表,定義如下:

  • struct?files_struct?{??
  • ????????…??
  • ????????struct?fdtable?fdtab;??
  • ????????…??
  • ????????struct?file?__rcu?*?fd_array[NR_OPEN_DEFAULT];??
  • }; ?
  • 其成員fdtab為關鍵數據成員,定義如下:

  • struct?fdtable?{??
  • ????????unsigned?int?max_fds;??
  • ????????struct?file?__rcu?**fd;??????/*?current?fd?array?*/??
  • ????????unsigned?long?*close_on_exec;??
  • ????????unsigned?long?*open_fds;??
  • ????????struct?rcu_head?rcu;??
  • }; ?
  • 這說明普通的文件、套接字、管道等,都被抽象為文件,共同占用進程的打開文件描述符。

        http://blog.csdn.net/aprilweet/article/details/53482930

    ========================另外一篇=============================

    ?

    /Proc 目錄下面有許多數字命名的子目錄,這些數字表示系統當前運行的進程號;
    其中/proc/N/fd目錄下面保存了打開的文件描述符,指向實際文件的一個鏈接。如下:

    ?

    root@yang-ubuntu:/proc/4810/fd# ll
    總用量 0

    dr-x------ 2 root root 0 3月 8 16:07 ./
    dr-xr-xr-x 8 root root 0 3月 8 16:07 ../
    lrwx------ 1 root root 64 3月 8 16:08 0 -> /dev/pts/1
    lrwx------ 1 root root 64 3月 8 16:08 1 -> /dev/pts/1
    lrwx------ 1 root root 64 3月 8 16:09 10 -> socket:[21190]
    lrwx------ 1 root root 64 3月 8 16:07 2 -> /dev/pts/1
    lrwx------ 1 root root 64 3月 8 16:08 3 -> /tmp/ZCUDY7QsPB (deleted)
    lrwx------ 1 root root 64 3月 8 16:08 4 -> /tmp/sess_0fpvhvcpftcme834e1l4beo2i6
    lrwx------ 1 root root 64 3月 8 16:08 5 -> socket:[20625]
    lrwx------ 1 root root 64 3月 8 16:08 6 -> anon_inode:[eventpoll]
    lrwx------ 1 root root 64 3月 8 16:08 7 -> socket:[20626]
    lrwx------ 1 root root 64 3月 8 16:08 8 -> socket:[20627]
    lrwx------ 1 root root 64 3月 8 16:09 9 -> socket:[21189]

    ?

    我們想查看9 -> Socket文件描述符的鏈接狀態該怎么看呢?聰明的注意到后面有個數字[21189],這個數字又是哪兒來的呢?請往下看。

    ?

    在/proc/net/tcp目錄下面保存了所有TCP鏈接的狀態信息。

    root@yang-ubuntu:/proc/net# vim /proc/net/tcp
    sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
    0: 00000000:0CEA 00000000:0000 0A 00000000:00000000 00:00000000 00000000 1001 0 9482 1 ffff88001a501a00 100 0 0 10 -1
    1: 00000000:008B 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 8916 1 ffff88001a501380 100 0 0 10 -1
    2: 00000000:0050 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 11440 1 ffff88001a502080 100 0 0 10 -1
    3: 0100007F:0035 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 12333 1 ffff88001a502700 100 0 0 10 -1
    4: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 7922 1 ffff88001a500000 100 0 0 10 -1
    5: 0100007F:0277 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 13302 1 ffff88001a500680 100 0 0 10 -1
    6: 00000000:01BD 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 8914 1 ffff88001a500d00 100 0 0 10 -1
    7: 00000000:0929 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 20625 1 ffff88001a504100 100 0 0 10 -1
    8: 8064A8C0:01BD 0164A8C0:C26A 01 00000000:00000000 02:00030E57 00000000 0 0 13216 2 ffff88001a503a80 22 4 1 10 18
    9: 8064A8C0:0929 0164A8C0:F4B5 01 00000000:00000000 02:00097B3E 00000000 0 0 21189 2 ffff88001a505b00 24 4 28 10 -1
    10: 8064A8C0:0016 0164A8C0:CD9C 01 00000000:00000000 02:0000B4B4 00000000 0 0 17721 2 ffff88001a503400 22 4 20 10 -1
    11: 8064A8C0:0016 0164A8C0:CDAE 01 00000000:00000000 02:0000DB1B 00000000 0 0 18130 2 ffff88001a504e00 24 4 31 10 -1
    12: 8064A8C0:0929 0164A8C0:F4B6 01 00000000:00000000 02:00097B3E 00000000 0 0 21190 2 ffff88001a506800 24 4 24 10 -1
    13: 8064A8C0:0016 0164A8C0:CDAC 01 00000000:00000000 02:0000DB1B 00000000 0 0 18074 2 ffff88001a502d80 21 4 24 10 -1
    14: 8064A8C0:0016 0164A8C0:F3FC 01 00000000:00000000 02:00089B3B 00000000 0 0 20675 2 ffff88001a506180 24 4 25 10 -1
    15: 8064A8C0:0016 0164A8C0:CDAD 01 00000080:00000000 01:00000018 00000000 0 0 18102 4 ffff88001a504780 24 4 21 10 -1

    ?

    看上數字【21189?】沒有,就是這兒來的,到此我們可以找出鏈接的IP、PORT鏈接四元組【8064A8C0:0929?0164A8C0:F4B5】這個地方是用十六進制保存的,換算成十進制方式【192.168.100.128:2345 ? ? ? ? ? ?192.168.100.1:62645】;

    去網絡連接狀態里面看一下:

    ?

    root@yang-ubuntu:/proc/4275/fd# netstat -antp
    激活Internet連接 (服務器和已建立連接的)
    Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
    tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 1710/mysqld
    tcp 0 0 0.0.0.0:139 0.0.0.0:* LISTEN 1062/smbd
    tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1736/nginx.conf
    tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 1925/dnsmasq
    tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 628/sshd
    tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 709/cupsd
    tcp 0 0 0.0.0.0:445 0.0.0.0:* LISTEN 1062/smbd
    tcp 0 0 0.0.0.0:2345 0.0.0.0:* LISTEN 4809/start.php
    tcp 0 0 192.168.100.128:445 192.168.100.1:49770 ESTABLISHED 2514/smbd
    tcp 0 0 192.168.100.128:2345 192.168.100.1:62645 ESTABLISHED 4810/0.0.0.0:2345
    tcp 0 0 192.168.100.128:22 192.168.100.1:52636 ESTABLISHED 3565/sshd: root@not
    tcp 0 0 192.168.100.128:22 192.168.100.1:52654 ESTABLISHED 3718/3
    tcp 0 0 192.168.100.128:22 192.168.100.1:52652 ESTABLISHED 3714/1
    tcp 0 0 192.168.100.128:22 192.168.100.1:62460 ESTABLISHED 4817/4
    tcp 0 0 192.168.100.128:22 192.168.100.1:52653 ESTABLISHED 3716/2
    tcp6 0 0 :::139 :::* LISTEN 1062/smbd
    tcp6 0 0 :::22 :::* LISTEN 628/sshd
    tcp6 0 0 ::1:631 :::* LISTEN 709/cupsd
    tcp6 0 0 :::445 :::* LISTEN 1062/smbd

    回到開始的問題:9 Socket文件描述符代表的是本地【192.168.100.128:2345】到【192.168.100.1:62645】的一條TCP連接!

    ?

    為什么往socket中寫數據,就會發送到對端(只針對tcp協議的研究)??舉例:瀏覽器請求服務器?

    客戶端首先發起建立與服務器TCP連接。一旦建立連接,瀏覽器進程和服務器進程就可以通過各自的套接字來訪問TCP。

    客戶端套接字是客戶進程和TCP連接之間的“門”,服務器端套接字是服務器進程和同一TCP連接之間的“門”。

    客戶往自己的套接字發送HTTP請求消息,也從自己的套接字接收HTTP響應消息。

    類似地,服務器從自己的套接字接收HTTP請求消息,也往自己的套接字發送HTTP響應消息。

    客戶端或服務器一旦把某個消息送入各自的套接字,這個消息就完全落入TCP的控制之中//所以說底層是基于tcp提供的可靠的消息傳輸機制

    TCP給HTTP提供一個可靠的數據傳輸服務;這意味著由客戶發出的每個HTTP請求消息最終將無損地到達服務器,由服務器發出的每個HTTP響應消息最終也將無損地到達客戶。

    ?

    轉載于:https://www.cnblogs.com/web21/p/6520164.html

    總結

    以上是生活随笔為你收集整理的Linux中通过Socket文件描述符寻找连接状态介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。