套接字和网络连接

套接字用于通信,特别是在网络上。套接字起初是由unix系统的bsd分支开发出来的,但现在一般可以移植到其它类unix系统上:linux和system v的变种同样支持套接字,而且支持套接字是open group的单一unix规格[open group 1997]所要求的。system v系统传统上使用一个不同(不兼容)的网络通信接口,但这对像solaris这样包括对套接字支持的系统来说不值一提。socket(2)创建一个通信端点并返回一个描述符,与open(2)对文件的操作相似。套接字的参数指定协议族和类型,例如internet域(tcp/ipv4)、novell的ipx或“unix域”。服务器程序一般调用bind(2)、listen(2)和accept(2)或select(2),客户程序一般调用bind(2)(虽然可能被省略)和connect(2)。参见这些例程相应的man帮助页以了解更多信息。通过相应的man帮助页可能很难理解如何使用套接字;也许需要参考hall的“beej”[1999]一类的文献来学习如果共同使用这些调用。

“unix域套接字”实际上并不代表一个网络协议;它们只能与同一台机器上的套接字相连接。(在为标准linux内核编写本文的目前情况下)。在被作为流使用时,它们与命名管道非常相似,而优越性很明显。特别是unix域套接字面向连接;每一个到套接字的新连接都产生一个新的通信管道,这与命名管道完全不同。正是由于这一特性,unix域套接字经常被用来代替命名管道实现很多重要服务中的ipc。就像可以拥有非命名管道一样,可以用socketpair(2)来得到非命名unix域套接字;与非命名管道类似,非命名unix域套接字对于ipc也很有用。

unix域套接字有几个有趣的安全内涵。首先,虽然unix域套接字可以出现在文件系统中,而且可以对它们使用stat(2),却不能用open(2)打开它们(只能使用socket(2)和友好接口)。其次,unix域套接字可以用来在进程间传递文件描述符(而不仅仅是文件的内容)。其它ipc机制都不提供的这一奇特能力被用来破解所有规范(描述符基本上可以用作受限制版本的计算机科学意义上的“能力”)。文件描述符用sendmsg(2)发送,其中msg(消息)的msg_control域指向一个控制消息头的数组(msg_controllen域必须指定数组中所包含的字节数目)。每条控制消息都是一个带有数据的cmsghdr结构,为达到此目的需要把cmsg_type设置为scm_rights。文件描述符通过recvmsg(2)获得,然后以相似的方式传递下去。坦白地说,该特性风格有些绮靡,但值得了解。

linux 2.2支持unix域套接字的一个附加特性:可以获取对端的“可信任证明”(pid、uid和gid)。下面是一段代码示例:

/* fd= file descriptor of Unix domain socket connected
to the client you wish to identify */
struct ucred cr;
int cl=sizeof(cr);
if (getsockopt(fd, SOL_SOCKET, SO_PEERCRED, &cr, &cl)==0) {
printf("Peer's pid=%d, uid=%d, gid=%d\n",
cr.pid, cr.uid, cr.gid);

标准的unix约定是需要root权限来绑定小于1024的数字作为tcp和udp本地端口号,而任何进程都可以绑定一个大于或等于1024的不受约束的端口号。linux遵循了这一约定,更具体地说,要绑定小于1024的端口号,linux要求进程具有cap_net_bind_service能力;一般此能力只有euid为0的进程才拥有。想进一步了解的读者可以查看linux下相应的源码;在linux 2.2.12中为文件/usr/src/linux/net/ipv4/af_inet.c中的函数inet_bind()。

时间: 2024-07-29 20:41:08

套接字和网络连接的相关文章

用原始套接字实现网络监听

1.引言 网络监听工具(sinff)是提供给网络管理员的一类管理工具.在以太网中(Ethernet),当网络上连接多台计算机时,某瞬间只能有一台计算机可以传送数据.以太网中,数据是以被称为帧的数据结构为单位进行交换的.通常,在计算机网络上交换的数据结构体的单位是数据包.而在以太网中则称为帧.这种数据包是由记录着数据包发送给对方所必需信息的报头部分和记录着发送信息的报文部分构成.报头部分包含接收端的地址.发送端的地址.数据校验码等信息. 在以太网上,帧(数据包)是被称为带碰撞检测的载波侦听多址访问

Python中利用原始套接字进行网络编程的示例

  这篇文章主要介绍了Python中利用原始套接字进行网络编程的示例,使用sock_raw接受和发送数据包可以避开网络协议的诸多限制,需要的朋友可以参考下 在实验中需要自己构造单独的HTTP数据报文,而使用SOCK_STREAM进行发送数据包,需要进行完整的TCP交互. 因此想使用原始套接字进行编程,直接构造数据包,并在IP层进行发送,即采用SOCK_RAW进行数据发送. 使用SOCK_RAW的优势是,可以对数据包进行完整的修改,可以处理IP层上的所有数据包,对各字段进行修改,而不受UDP和TC

Java套接字(Socket)网络编程入门_java

网络应用模式主要有: 主机/终端模式:集中计算,集中管理: 客户机/服务器(Client/Server,简称C/S)模式:分布计算,分布管理: 浏览器/服务器模式:利用Internet跨平台. www(万维网)就是建立在客户机/服务器模式上,以HTML语言和HTTP协议为基础,能够提供各种Internet服务的信息浏览系统.网络信息放在主机的不同位置,www服务器利用超文本链路链接各项信息.www客户机(浏览器Brower)负责与服务器建立联系,向服务器发送请求,处理HTML超媒体,提供图形用户

【网络编程2】Java数据报套接字

这篇博文是本文学习<Java网络程序设计>书中第5章数据报套接字的学习总结.初学者网友学习这篇Java数据报套接字文章,如果难于理解文章前面理论部分,可以先运行后面的程序,边看运行后面的程序边理解前面的原理,这对初学者是最好的方法.所有源代码都在文章后面我的github链接代码中. --惠州学院13网络工程 吴成兵 20160609 目录 1 目录 1 一 数据报套接字概述 二 DatagramPacket 21 创建DatagramPacket对象 211 创建的DatagramPacket

【网络编程1】Java套接字Socket

这篇博客是本人学习<Java网络程序设计>书中第4章套接字的学习总结.初学者网友学习这篇Java套接字文章,如果难于理解文章前面理论部分,可以先运行后面的程序,边看运行后面的程序边理解前面的原理,这对初学者是最好的方法.所有源代码都在文章后面我的github链接代码中. --惠州学院 13网络工程 吴成兵 20160607 目录 1 目录 1 一 流套接字概述 二 服务器套接字ServerSocket 21 ServerSocket的工程过程 22 ServerSocket构造方法 23 Se

原始套接字-VPN到底是什么东西,有几个问题请教一下网络编程大神

问题描述 VPN到底是什么东西,有几个问题请教一下网络编程大神 1.有人说VPN能把系统的所有流量代理走,那么包不包括使用RAW Socket(原始套接字)发送的链路层数据帧呢? 2.VPN究竟是什么鬼?那PPTP协议是什么鬼?我能用原始套接字模拟PPTP连接吗,PPTP协议到底是什么协议,百度上有人说PPTP是第二层协议,那不就是链路层协议吗,还有人说PPTP基于TCP,我也是醉了.请问有没有关于VPN协议的书籍? 解决方案 vpn工作在ip层,RAW Socket的包不能保留,必须做修改,对

Java网络编程菜鸟进阶:TCP和套接字入门

我竟然到现在才发现<Fundamental Networking in Java>这本神作,真有点无地自容的感觉.最近几年做的都是所谓的企业级开发,免不了和网络打交道,但在实际工作中,往往会采用框架将底层细节和上层应用隔离开,感觉就像是在一个 Word 模板表单里面填写内容,做出来也没什么成就感.虽然没有不使用框架的理由,但我还真是有点怀念当初直接用套接字做网络编程的日子,既能掌控更多东西,还可以学到更多知识,为研究框架的实现原理打基础.闲话完毕,转入今天的正题:IP(Internet Pro

python socket网络编程步骤详解(socket套接字使用)_python

一.套接字套接字是为特定网络协议(例如TCP/IP,ICMP/IP,UDP/IP等)套件对上的网络应用程序提供者提供当前可移植标准的对象.它们允许程序接受并进行连接,如发送和接受数据.为了建立通信通道,网络通信的每个端点拥有一个套接字对象极为重要.套接字为BSD UNIX系统核心的一部分,而且他们也被许多其他类似UNIX的操作系统包括Linux所采纳.许多非BSD UNIX系统(如ms-dos,windows,os/2,mac os及大部分主机环境)都以库形式提供对套接字的支持.三种最流行的套接

iOS - Socket 网络套接字

1.Socket 套接字 所谓 Socket,通常称为 "套接字",网络应用程序通过套接字向网络发送请求或者应答网络请求.Socket 通常用于描述 IP 地址和端口,是应⽤层与 TCP/IP 协议族通信的中间软件抽象层,它是一组接口,是一个通信链的句柄,可以用来实现不同虚拟机或者不同计算机之间的通信.在设计模式中,Socket 其实就是一个门面模式,它把复杂的 TCP/IP 协议族隐藏在 Socket 接⼝后面. Socket 起源于 Unix,而 Unix/Linux 基本哲学之一