linux一切皆文件之tcp socket描述符(三)

一、知识准备

1、在linux中,一切皆为文件,所有不同种类的类型都被抽象成文件(比如:块设备,socket套接字,pipe队列)
2、操作这些不同的类型就像操作文件一样,比如增删改查等

二、环境准备

组件 版本 OS CentOS Linux release 7.5.1804

三、tcp socket 文件描述符

● 当我们建立一条TCP连接时,在linux操作系统中会创建一个socket文件描述符
● 通过文件描述符就能找到socket的几本信息,比如TCP四元组( client-ip:client-port --> server-ip:server-port

先准备2个脚本:
server.py主要用于建立客户端的连接请求,并且接收客户端传来的数据,然后将收到的数据回传给客户端
client.py每隔1秒向服务端发送一次’hello world’

server.py

import socket

server_addr = ('127.0.0.1' , 22222)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(server_addr)
sock.listen(5)

while True:
    conn, clientAddr = sock.accept()
    while True:
        data = conn.recv(100)
        conn.sendall(data)

sock.close()

client.py

import socket
import time

server_addr = ('127.0.0.1' , 22222)

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(server_addr)

while True:
    message = 'hello world!'
    sock.send(message)
    sock.recv(100)
    time.sleep(1)

sock.close()

分别启动server.py与client.py

[root@localhost ~]# python /tmp/server.py  &
[1] 14199
[root@localhost ~]# python /tmp/client.py  &
[2] 14202

查看server.py打开的文件描述符

[root@localhost ~]# ls -l /proc/14199/fd
total 0
lrwx------ 1 root root 64 Nov  7 07:42 0 -> /dev/pts/0
lrwx------ 1 root root 64 Nov  7 07:42 1 -> /dev/pts/0
lrwx------ 1 root root 64 Nov  7 07:42 2 -> /dev/pts/0
lrwx------ 1 root root 64 Nov  7 07:42 3 -> socket:[99154]
lrwx------ 1 root root 64 Nov  7 07:42 4 -> socket:[99155]
[root@localhost ~]# lsof -n | grep -E '99154|99155'
python    14199         root    3u     IPv4              99154       0t0        TCP 127.0.0.1:22222 (LISTEN)
python    14199         root    4u     IPv4              99155       0t0        TCP 127.0.0.1:22222->127.0.0.1:56946 (ESTABLISHED)

我们主要关注 ESTABLISHED状态的socket描述符,也就是 4 -> socket:[99155]

[root@localhost fd]# more /proc/net/tcp
  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode
  ...

   4: 0100007F:56CE 0100007F:DE72 01 00000000:00000000 00:00000000 00000000     0        0 99155 1 ffff90d8bb0145c0 20 4 31 10 -1

进程打开了tcp socket 描述符 4 -> socket:[99155],socket描述符指向内存中的socket结构体,该结构体详细描述了这个socket的详细信息

最重要的是TCP四元组( local_ip:local_port --> remote_ip:remote_port),拆分转换成10进制

0100007F:56CE

[root@localhost ~]# ((d=0x01))
[root@localhost ~]# ((c=0x00))
[root@localhost ~]# ((b=0x00))
[root@localhost ~]# ((a=0x7F))
[root@localhost ~]# ((e=0x56CE))
[root@localhost ~]# echo "$a.$b.$c.$d:$e"
127.0.0.1:22222

0100007F:DE72

[root@localhost ~]# ((d=0x01))
[root@localhost ~]# ((c=0x00))
[root@localhost ~]# ((b=0x00))
[root@localhost ~]# ((a=0x7F))
[root@localhost ~]# ((e=0xDE72))
[root@localhost ~]# echo "$a.$b.$c.$d:$e"
127.0.0.1:56946

在/proc/net/tcp包含了tcp连接的重要状态信息:
00000000:00000000 : 发送队列与接收队列 (正数第四个字段)
-1 : 慢启动门限 (倒数第一个字段)
10 : 拥塞窗口 (倒数第二个字段)

这里面还有很多描述:比如慢启动门限、传输队列以及接收队列、窗口探查等TCP相关的重要参数都可以查询到,具体的大家可以去看下《TCP/IP详解卷》

client.py也存在同样的行为:

[root@localhost ~]# ls -l /proc/14202/fd
total 0
lrwx------ 1 root root 64 Nov 19 04:43 0 -> /dev/pts/0
lrwx------ 1 root root 64 Nov 19 04:43 1 -> /dev/pts/0
lrwx------ 1 root root 64 Nov 19 04:43 2 -> /dev/pts/0
lrwx------ 1 root root 64 Nov 19 04:43 3 -> socket:[28728]
[root@localhost ~]# lsof -n | grep 28728
python    14202         root    3u     IPv4              28728       0t0        TCP 127.0.0.1:56946->127.0.0.1:22222 (ESTABLISHED)
[root@localhost fd]# more /proc/net/tcp
  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode
  ...

3: 0100007F:C31A 0100007F:DE72 01 00000000:00000000 00:00000000 00000000     0        0 28728 3 ffff8a74ba1a0f80 20 4 30 10 -1

0100007F:56CE

[root@localhost ~]# ((d=0x01))
[root@localhost ~]# ((c=0x00))
[root@localhost ~]# ((b=0x00))
[root@localhost ~]# ((a=0x7F))
[root@localhost ~]# ((e=0x56CE))
[root@localhost ~]# echo "$a.$b.$c.$d:$e"
127.0.0.1:22222

0100007F:DE72

[root@localhost ~]# ((d=0x01))
[root@localhost ~]# ((c=0x00))
[root@localhost ~]# ((b=0x00))
[root@localhost ~]# ((a=0x7F))
[root@localhost ~]# ((e=0xDE72))
[root@localhost ~]# echo "$a.$b.$c.$d:$e"
127.0.0.1:56946

总结一下:
● server.py与client.py各自打开tcp socket 描述符,该描述符指向内存中的socket结构体
● socket结构体描述了关于TCP的所有信息,其中通过TCP 4元组找到对端的通信节点
● socket将用户数据以及自身结构数据封装完成之后会交给底层的TCP协议,然后是IP协议、链路层信息,最后通过物理链路到达对端
● 对端也会依次解包,直至将发送端数据写入到指定的内存当中,最终由应用程序读取(本文中的server.py或client.py)

                        client.py                         server.py
                        +---------------+                 +---------------+
                        |pid:14202      |                 |pid:14199      |
                        |    +-----+    |                 |    +-----+    |
                        |    |fd:3 |    |                 |    |fd:4 |    |
                        |    +-----+    |                 |    +-----+    |
                        +---------------+                 +---------------+
                                |                                 |
             user space         |                                 |
             +---------------------------------------------------------------------+
             kernel space       |                                 |
                                |                                 |
                                v                                 v
                         +------+-------+                  +------+-------+
                         |socket:[28728]|                  |socket:[99155]|
                         +------+-------+                  +------+-------+
                                |                                 |
                                |                                 |
                                v                                 v
                           +----+----+                       +----+----+
                           | socket  |                       | socket  |
                           +----+----+                       +----+----+
                                |                                 |
                                |                                 |
                                v                                 v
                               ++---------------------------------+-
                               |                tcp                |
                               +------------------------------------

四、小结

● TCP连接中最重要的是TCP四元组,而进程打开TCP socket描述符可以找到四元组信息,从而确定双方的IP和port
● 通过socket文件描述符可以找到内存中的socket结构体,获取到TCP连接的详细信息,包括必备四元组、文件的inode、时间、出队入队状态等等
● 1个进程可以创建多个TCP连接,也就是创建多个socket文件描述符,这由该进程能够打开的文件数量限制( ulimit -n

五、参考资料

至此,本文结束
在下才疏学浅,有撒汤漏水的,请各位不吝赐教…

Original: https://www.cnblogs.com/MrVolleyball/p/9987208.html
Author: wilson排球
Title: linux一切皆文件之tcp socket描述符(三)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/597258/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Vue快速上门(3)-组件与复用

    VUE家族系列: Vue快速上门(1)-基础知识 Vue快速上门(2)-模板语法 Vue快速上门(3)-组件与复用 01、component组件 1.1、component基础知识…

    Python 2023年10月12日
    033
  • 【面试总结】人事面试问题

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/upstudy/p/16709007.htmlAutho…

    Python 2023年6月15日
    072
  • BiSeNet – 轻量级实时语义分割

    前言 在语义分割领域,由于需要对输入图片进行逐像素的分类,运算量很大。通常,为了减少语义分割所产生的计算量,通常而言有两种方式:减小图片大小和降低模型复杂度。 减小图片大小可以最直…

    Python 2023年9月29日
    055
  • matplotlib.pyplot.plot教程

    本文翻译官方文档 matplotlib.pyplot.plot 文章目录 matplotlib.pyplot.plot * 绘制带标记的数据 绘制多个数据集 Line2D属性 Ma…

    Python 2023年9月6日
    055
  • 【4天快速入门Python数据挖掘之第2天】Numpy——高效的运算工具

    🔥一个人走得远了,就会忘记自己为了什么而出发,希望你可以不忘初心,不要随波逐流,一直走下去🎶🦋 欢迎关注🖱点赞👍收藏🌟留言🐾🦄 本文由 程序喵正在路上 原创,CSDN首发!💖 系列…

    Python 2023年8月25日
    054
  • 二、Python数据挖掘(Matplotlib库)

    二、Python数据挖掘(Matplotlib库) 目录: 二、Python数据挖掘(Matplotlib库) * – + 一、Matplotlib 简介 二、Matp…

    Python 2023年9月5日
    039
  • 强化学习资源汇总

    配置环境 (2)使用conda管理运行环境: 创建环境:conda create -n your_env_name python=x.x 删除环境:conda remove -n …

    Python 2023年6月3日
    068
  • 数据可视化:四种关系图数据可视化的效果对比!

    python关系图的可视化主要就是用来分析一堆数据中,每一条数据的节点之间的连接关系从而更好的分析出人物或其他场景中存在的关联关系。 这里使用的是networkx的python非标…

    Python 2023年9月4日
    069
  • PyCharm编辑器的python与pip匹配

    pip版本依赖它的python版本,不同版本之间,函数库方法有所调整,版本不一致就可能无法运行。在PyCharm的终端,进行相关的匹配查询及解决。 python 版本查询 命令:p…

    Python 2023年9月3日
    054
  • python数据分析—删除value=0的行

    文章目录 前言 一、数据处理 二、删除某行方法的使用 1.删除全行都是为0的行 2.用nan替换零,然后删除所有行中数据都为nan的行。之后,将nan替换为零。 3.删除某行中某个…

    Python 2023年8月9日
    041
  • 一个普通java程序员的10年…泪奔 o(╥﹏╥)o o(╥﹏╥)o

    大家好,我是曹尼玛,是一个很普通java程序员,今天看了下日历,转眼间,毕业9年,工作10年了,经历比较多,受伤比较多,收获比较多,改变也很多,对未来也有一些规划,对java新人也…

    Python 2023年9月16日
    038
  • 数据分析_表和表的运用

    kobe_df = pd.read_csv(‘data/Kobe_data.csv’, index_col=’shot_id’) ser = kobe_df.action_type…

    Python 2023年8月9日
    0162
  • 游戏开发引擎(Pygame)核心方法

    Pygame是Python最经典的2D游戏开发第三方库,机巧围棋基于Pygame游戏开发引擎实现围棋游戏运行和交互逻辑,并搭建围棋游戏可视化界面。 本文不是Pygame的API文档…

    Python 2023年9月20日
    056
  • Web爬虫|入门实战之糗事百科(附源码)

    coding by real mind writing by genuine heart 解析 任务背景 :https://www.qiushibaike.com/hot/ 窥探网…

    Python 2023年6月3日
    061
  • python3文件的格式-jupyter

    csv文件转换方法: 1.直接建立一个XLS工作表 2.建立一个文本文档,点击另存为,保存类型选择 所有文件,在文件名+.csv(其他格式文件也是) 3.txt文件转csv文件: …

    Python 2023年8月21日
    043
  • Python实现多功能音乐播放器

    导入 import os import time import tkinter import tkinter.filedialog import threading import …

    Python 2023年5月24日
    058
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球