socket、端口、进程的关系
来源:互联网 发布:网络彩票服务器在国外 编辑:程序博客网 时间:2024/06/06 22:35
socket、端口、进程的关系!
端口是TCP/IP协议中的概念,描述的是TCP协议上的对应的应用,可以理解为基于TCP的系统服务,或者说系统进程!如下图,FTP就需要占用特定的TCP端口。
而 socket 呢,是网络编程中的概念,对TCP/IP协议进行了抽象和实现,并为应用层提供接口。这里的应用A,可以是FTP应用,它属于用户进程,通过socket与内核中的网络协议栈进行交互。
socket 是核心,是枢纽,是进程与网络建立关系的必经之路!
1 内核是如何将数据包转发至 socket 的呢?
网络数据首先到达网卡,然后进入内核,由网络协议栈去处理,那么内核是如何进行数据分发的呢?它怎么知道该如何把数据交给特定的用户进程呢?
这时,就需要 socket 发挥作用了!
socket 中存储了特定的四元组: 源ip+port,目的ip+port;
1> bind 到特定 ip 和 port 的socket 对应 [src ip, src port) <=> (*, *)] ;2> connect 到特定目的ip+port 的 socket 对应 [src ip, src port) <=> (dst ip, dst port)];3> accept 返回了的 socket 对应 [src ip, src port) <=> (dst ip, dst port)];
那么内核根据数据包的四元组信息,就可以锁定特定的socket了。并可,系统中所有 socket 中的四元组信息,必定唯一,不可能重复!
2 进程与socket的关系是怎样的呢?
每个进程,在内核中都有一个表,保存了该进程申请并占用的所有 socket 描述符,在进程看来,socket 其实跟文件也没有什么不同,只不过通过描述符获得的对象不同而已,接口对应的系统调用也不同。
那么进程跟socket是一一对应的吗?
其实不然,socket是一种资源,就像文件一样,一个进程打开了,另一个进程也可以用,只不过socket比较特殊而已。
理论上,能够通过 sendmsg 将 socket 描述符传递给其他进程,这样其他进程就可以调用该描述符的接口了。这种场景确实不怎么会用到,也没有进行实际验证。
当然,父子进程间,还有线程间,进行 socket 的共享,是比较常见的。
3 进程与端口
进程与端口,其实并没有什么直接或必然的关系,关键还是socket!
wireshark 抓包查看tcp协议数据包详情:
server:
#-*- coding:utf-8 -*-from SocketServer import TCPServer, BaseRequestHandlerimport tracebackclass MyBaseRequestHandlerr(BaseRequestHandler): """ #从BaseRequestHandler继承,并重写handle方法 """ def handle(self): #循环监听(读取)来自客户端的数据 while True: #当客户端主动断开连接时,self.recv(1024)会抛出异常 try: #一次读取1024字节,并去除两端的空白字符(包括空格,TAB,\r,\n) data = self.request.recv(1024).strip() #self.client_address是客户端的连接(host, port)的元组 print "receive from (%r):%r" % (self.client_address, data) #转换成大写后写回(发生到)客户端 self.request.sendall(data.upper()) except: traceback.print_exc() breakif __name__ == "__main__": #telnet 127.0.0.1 9999 host = "" #主机名,可以是ip,像localhost的主机名,或"" port = 9999 #端口 addr = (host, port) #购置TCPServer对象, server = TCPServer(addr, MyBaseRequestHandlerr) #启动服务监听 server.serve_forever()
client:
import sockets = socket.socket( socket.AF_INET, socket.SOCK_STREAM )s.connect(( "xxx.xxx.xx.xx", 9999))s.send("Hello socket!")
总结
socket 的本质是一种资源,它包含了端到端的四元组信息,用来标识数据包的归属。因此,尽管 tcp 协议的端口号只有 65535 个,但是进程可拥有的 socket 数据却不限于此(受限于进程最大文件描述符数据);
- socket、端口、进程的关系
- socket编程中父子进程、兄弟进程的端口问题
- TCP UDP 及 Socket的关系 端口的分类
- 进程、线程、端口间关系
- 控制台下关于进程和本地端口的关系
- 同一进程中同一端口如何区分不同的Socket
- 使用fuser查询文件、目录、socket端口的占用进程
- 同一进程中同一端口如何区分不同的Socket
- Socket 端口的限制
- socket的端口状态
- Linux进程和端口对应关系查看
- linux下进程与端口关系查找
- Linux进程和端口对应关系查看
- 端口号、进程号之间关系
- socket,端口,进程问答(收集整理)
- java 进程号 socket获取空闲端口
- 查找端口的进程
- TCL中用exec启动的进程占用SOCKET端口问题分析
- webUI自动化测试框架(三):代码分层-对象库层
- 微信域名检测,微信域名防封开发文档
- Pandas(DataFrame)
- 链表 leetcode 143 Reorder List
- PHP中PSR-[0-4]代码规范
- socket、端口、进程的关系
- HashMap的工作原理
- template <typename T>是什么
- build-tools\23.0.3\aapt.exe'' finished with non-zero exit value 1错误提示
- Win下Mysql[mysql-5.7.13-winx64]编码格式修改
- Html-响应式布局、弹性布局
- Unity Shader入门精要学习笔记
- js面向对象编程
- ajax提交表单并接收json