socket、端口、进程的关系

原创 2017年06月25日 15:12:06

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, BaseRequestHandler
import traceback

class 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()
                break

if __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 socket

s = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
s.connect(( "xxx.xxx.xx.xx", 9999))
s.send("Hello socket!")

这里写图片描述

总结

socket 的本质是一种资源,它包含了端到端的四元组信息,用来标识数据包的归属。因此,尽管 tcp 协议的端口号只有 65535 个,但是进程可拥有的 socket 数据却不限于此(受限于进程最大文件描述符数据);

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/antony1776/article/details/73717666

HR-XML(可扩展人力资源标准)简介

HR-XML(可扩展人力资源标准)简介Flyspace (flyspace@x263.net)      2003年12月12日  标准出处:http://www.hr-xml.org标准简介:什么是...
  • FlySpace
  • FlySpace
  • 2003-12-13 02:25:00
  • 4643

socket几种连接方式简介及端口介绍

socket服务器和客户端的端口只能是49152到65535,有些不解,于是百度了一下,看到一个介绍端口的,感觉还不错。就复制过来了,原文:http://zhidao.baidu.com/link?u...
  • H1250161943
  • H1250161943
  • 2016-09-19 23:20:45
  • 5497

socket端口范围

一般端口的范围(由 IANA 保留)0 到 1023   临时端口范围(对于通配绑定)1025 到 MaxUserPort 注册表设置值   可用作特定端口(对于特定绑定)从 0 到 6553...
  • jolin678
  • jolin678
  • 2015-11-04 23:36:51
  • 2806

Linux网络编程——端口复用(多个套接字绑定同一个端口)

在《绑定( bind )端口需要注意的问题》提到:一个网络应用程序只能绑定一个端口( 一个套接字只能绑定一个端口 )。 实际上,默认的情况下,如果一个网络应用程序的一个套接字 绑定了一个端口( 占用了...
  • tennysonsky
  • tennysonsky
  • 2015-03-04 18:07:02
  • 14448

Socket,端口,ip区别

三者从本质上来说没有可比性,   socket则是对TCP/IP协议的封装和应用(程序员层面上)。   也可以说,TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,   而HTTP是应用层协...
  • u012960536
  • u012960536
  • 2015-05-21 16:12:23
  • 2554

端口重叠情况下Socket的创建与释放

就一个Socket完成传输后重建的问题,被坑了整整两天。 在这里简单记录 一下。 为了完成NET穿透,在客户端我们用 TCPClient 使用随机端口号,创建一个到服务器的连接,然后在相同的端口上...
  • okkk
  • okkk
  • 2017-01-10 22:10:12
  • 2081

同一端口如何区分不同的Socket

为了区分不同应用进程间的网络通信和连接,主要有3个参数:通信的目的IP地址、使用的传输层协议(TCP 或 UDP)和使用的端口号。     Socket的原意是“插座”。通过将这3个参数结合起来,与...
  • fansongy
  • fansongy
  • 2012-07-20 14:00:48
  • 25612

Socket 端口的限制

由一个经典问题来引出:一台机器最多可以建立多少tcp连接? 这个问题基本都是从server的角度来回答,因为很少会有客户端需要建立多个连接。 需要记住: client_ip:clie...
  • wabil
  • wabil
  • 2016-03-26 11:01:46
  • 3033

如何在socket 程序中绑定本地端口

我们行与交警进行连网,由于对方安全限制(网闸设备)必须限定发起端(client)源端口。我还是头一看到非要限制源端口的设备,虽然我认为这样会造成连接的不稳定,比如网络中断引起重新连接一定会导致本地端口...
  • hadelu
  • hadelu
  • 2006-09-06 19:43:00
  • 9468

端口与进程

windows下 一.查看windows系统端口号: netstat -abnov 1)windows查看3030端口号被占用的进程 第一步:netstat -aon|findstr 30...
  • qq_22275049
  • qq_22275049
  • 2017-03-13 10:44:23
  • 119
收藏助手
不良信息举报
您举报文章:socket、端口、进程的关系
举报原因:
原因补充:

(最多只允许输入30个字)