
(三)tcp socket描述符
发布日期:2021-05-08 17:51:03
浏览次数:18
分类:原创文章
本文共 6729 字,大约阅读时间需要 22 分钟。
文章目录
1.tcp socket描述
- 在linux中,一切皆为文件,所有不同种类的类型都被抽象成文件(比如:块设备,socket套接字,pipe队列)
- 操作这些不同的类型就像操作文件一样,比如增删改查等
- 当我们建立一条TCP连接时,在linux操作系统中会创建一个socket文件描述符
- 通过文件描述符就能找到socket的基本信息,比如TCP四元组(client-ip:client-port --> server-ip:server-port)
2.测试
-
server.py主要用于建立客户端的连接请求,并且接收客户端传来的数据,然后将收到的数据回传给客户端
-
client.py每隔1秒向服务端发送一次’hello world’
-
server.py
import socketserver_addr=('localhost', 22222)sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)sock.bind(server_addr)sock.listen(1);while True: conn, addr=sock.accept() while True: data=conn.recv(100) conn.sendall(data) conn.close()
- client.py
import socketimport timeserver_addr=('127.0.0.1',22222)sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)sock.connect(server_addr)while True: message='hello i am client' sock.sendall(message) sock.recv(100) time.sleep(1)sock.close()
- 分别启动server.py与client.py
[root@localhost pypg]# python server.py &[1] 7355[root@localhost pypg]# python client.py &[2] 7404
- 查看server.py打开的文件描述符
[root@localhost pypg]# ll /proc/7355/fdtotal 0lrwx------. 1 root root 64 Nov 23 17:04 0 -> /dev/pts/2lrwx------. 1 root root 64 Nov 23 17:04 1 -> /dev/pts/2lrwx------. 1 root root 64 Nov 23 17:02 2 -> /dev/pts/2lrwx------. 1 root root 64 Nov 23 17:04 3 -> socket:[104171599]lrwx------. 1 root root 64 Nov 23 17:04 4 -> socket:[104171603][root@localhost pypg]# lsof -n |grep -E '104171599|104171603'python 7355 root 3u IPv4 104171599 0t0 TCP 127.0.0.1:22222 (LISTEN)python 7355 root 4u IPv4 104171603 0t0 TCP 127.0.0.1:22222->127.0.0.1:39899 (ESTABLISHED)我们主要关注ESTABLISHED状态的socket描述符,也就是4 -> socket:[104171603][root@localhost pypg]# grep 104171603 /proc/net/tcp|more 13: 0100007F:56CE 0100007F:9BDB 01 00000000:00000000 00:00000000 00000000 0 0 104171603 1 ffff8802c7199740 20 3 25 10 -1进程打开了tcp socket 描述符4 -> socket:[104171603],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:222220100007F:9BDB[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 pypg]# ll /proc/7404/fdtotal 0lrwx------. 1 root root 64 Nov 23 17:04 0 -> /dev/pts/2lrwx------. 1 root root 64 Nov 23 17:04 1 -> /dev/pts/2lrwx------. 1 root root 64 Nov 23 17:02 2 -> /dev/pts/2lrwx------. 1 root root 64 Nov 23 17:04 3 -> socket:[104171714][root@localhost pypg]# lsof -n|grep 104171714python 7404 root 3u IPv4 104171714 0t0 TCP 127.0.0.1:39899->127.0.0.1:22222 (ESTABLISHED)[root@localhost pypg]# grep 104171714 /proc/net/tcp|more 20: 0100007F:9BDB 0100007F:56CE 01 00000000:00000000 00:00000000 00000000 0 0 104171714 1 ffff880325a8c440 20 3 24 10 -10100007F:9BDB [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:222220100007F:56CE [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
3.netstate查看tcp连接状态
CLOSED | 没有使用这个套接字[netstat 无法显示closed状态] |
LISTEN | 套接字正在监听连接[调用listen后] |
SYN_SENT | 套接字正在试图主动建立连接[发送SYN后还没有收到ACK] |
SYN_RECEIVED | 正在处于连接的初始同步状态[收到对方的SYN,但还没收到自己发过去的SYN的ACK] |
ESTABLISHED | 连接已建立 |
CLOSE_WAIT | 远程套接字已经关闭:正在等待关闭这个套接字[被动关闭的一方收到FIN] |
FIN_WAIT_1 | 套接字已关闭,正在关闭连接[发送FIN,没有收到ACK也没有收到FIN] |
CLOSING | 套接字已关闭,远程套接字正在关闭,暂时挂起关闭确认[在FIN_WAIT_1状态下收到被动方的FIN] |
LAST_ACK | 远程套接字已关闭,正在等待本地套接字的关闭确认[被动方在CLOSE_WAIT状态下发送FIN] |
FIN_WAIT_2 | 套接字已关闭,正在等待远程套接字关闭[在FIN_WAIT_1状态下收到发过去FIN对应的ACK] |
TIME_WAIT | 这个套接字已经关闭,正在等待远程套接字的关闭传送[FIN、ACK、FIN、ACK都完毕,这是主动方的最后一个状态,在过了2MSL时间后变为CLOSED状态] |
– | – |
4.总结
-
server.py与client.py各自打开tcp socket 描述符,该描述符指向内存中的socket结构体
-
socket结构体描述了关于TCP的所有信息,其中通过TCP 4元组找到对端的通信节点
-
socket将用户数据以及自身结构数据封装完成之后会交给底层的TCP协议,然后是IP协议、链路层信息,最后通过物理链路到达对端
-
对端也会依次解包,直至将发送端数据写入到指定的内存当中,最终由应用程序读取(本文中的server.py或client.py)
-
TCP连接中最重要的是TCP四元组,而进程打开TCP socket描述符可以找到四元组信息,从而确定双方的IP和port
-
通过socket文件描述符可以找到内存中的socket结构体,获取到TCP连接的详细信息,包括必备四元组、文件的inode、时间、出队入队状态等等
-
1个进程可以创建多个TCP连接,也就是创建多个socket文件描述符,这由该进程能够打开的文件数量限制(ulimit -n)
-
不能使用netstat -a|grep 104171603(fd的id),因为tcp连接没有文件inode,而unix domain socket是有的
client.py server.py +---------------+ +---------------+ |pid:7404 | |pid:7355 | | +-----+ | | +-----+ | | |fd:3 | | | |fd:4 | | | +-----+ | | +-----+ | +---------------+ +---------------+ | | user space | | +---------------------------------------------------------------------+ kernel space | | | | v v +------+-------+ +------+-------+ |socket:[104171714]| |socket:[104171603 ]| +------+-------+ +------+-------+ | | | | v v +----+----+ +----+----+ | socket | | socket | +----+----+ +----+----+ | | | | v v ++---------------------------------+- | tcp | +------------------------------------
参考:
https://www.cnblogs.com/MrVolleyball/p/9987208.htmlhttps://www.cnblogs.com/ccit/p/10065804.html
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2025年04月07日 03时44分39秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
C语言实现面向对象方法学的GLib、GObject-初体验
2021-05-09
系统编程-进程-ps命令、进程调度、优先级翻转、进程状态
2021-05-09
为什么我觉得需要熟悉vim使用,难道仅仅是为了耍酷?
2021-05-09
一个支持高网络吞吐量、基于机器性能评分的TCP负载均衡器gobalan
2021-05-09
HDOJ2017_字符串统计
2021-05-09
高等软工第二次作业《需求分析阶段总结》
2021-05-09
404 Note Found 团队会议纪要
2021-05-09
CentOS安装Docker-ce并配置国内镜像
2021-05-09
使用JWT作为Spring Security OAuth2的token存储
2021-05-09
使用Redis作为Spring Security OAuth2的token存储
2021-05-09
【SOLVED】Linux使用sudo到出现输入密码提示延迟时间长
2021-05-09
项目引入非配置的文件,打成war包后测试报错的可能原因
2021-05-09
Git学习笔记
2021-05-09
SpringBoot笔记
2021-05-09
让你的代码更优秀的 14 条建议
2021-05-09
不需要爬虫也能轻松获取 unsplash 上的图片
2021-05-09
将博客搬至CSDN
2021-05-09