套接字(linux相关)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了套接字(linux相关)相关的知识,希望对你有一定的参考价值。
前言:略
一、前因
一切从tcp、udp开始。
众所周知,网络模型一般有两种模型,一种为OSI概念模型(七层),另一种为tcp/ip网络模型(四层)。
tcp/ip应用层对应OSI的应用层、显示层、会话层;tcp、udp对应传输层;互联网层对应网络层;设备驱动程序和硬件对应物理层。如下图所示:’
在linux上,四层以下被称为通讯子网,四层以上被称为应用层。前者更注重通信细节,主要实现主机与主机之间如何完成数据报文传输;后者更注重应用层细节,主要实现资源交换。
linux启动后,应用层细节在用户空间实现,通信细节则在内核空间实现。
所以,最原始最有需求的跨主机间的通信,皆由内核完成;相对而言真正的应用则是通信协议在用户空间特定的实现方式,比如dns完成域名解析,比如ssh实现安全登陆。自然,既是完成特定功能,便不应该位于内核空间。
当然,也有所疑惑,主机间的通信不是通过IP地址间进行通信的吗? 没错。但是ip协议本身并不可靠,且是无连接的。相对而言,tcp协议确是有链接,传输层在一定程度上弥补了网络层的缺陷,当然这仅是其中一部分缘由。
二、正题
回归正题,所谓传输层(tcp、udp)是提供进程地址空间,用端口号(port number)来标识进程地址空间。
其中tcp是一种传输控制协议,即面向对象协议;通信前需建立虚拟链路,需事先知道对方是否在线,通信结束后还需断开链路(tcp的三次握手)。
而udp(User Datagram Protocol)是无连接协议;通信前无需建立虚拟链路,无需确定对方是否在线。
二者为完全不同的协议,且各有0-65535个端口。
前文所述,所有的应用层协议都位于应用层,倘若需要跨主机间进行通信,必须向内核申请,然而。。。然而,内核标记各主机之间通过网络进行通信时,却是通过套接字方式进行的。
那么问题又来了,套接字又是什么?
套接字(Socket):IPC的一种实现方式;主要目的是允许不同主机(也可以是同意主机)上不同进程之间进行通信从而完成数据交换。诚然,套接字既由内核实现也就属于内核,属于system call。事实上,Socket一般称之为Socket API,主要是它在system call中提供了太底层太基础,因此,在C标准库中才被称作Socket API。
所以具体实现方式是:当用户发起跨主机间通信时,会基于套接字的方式调用套接字,从而内核空间申请tcp、udp端口,从而建立虚拟链路(如果是tcp的话)进行通信。
题外话:除了tcp、udp之外还有另一种方式,使用裸套接字的方式,直接封装ip报文。
Socket的三种类型:
SOCK_STREAM:tcp套接字
SOCK_DGRAM:udp套接字
SOCK_RAM:裸套接字
综上所述,无论什么网络服务,都必定需要使用网络通信的基本功能。即tcp、udp、或者其他。
以上是关于套接字(linux相关)的主要内容,如果未能解决你的问题,请参考以下文章