套接字(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相关)的更多相关文章
- Win2 Socket(套接字)相关 API
Socket(套接字) 作者信息 肖进 单位:南京中萃食品有限公司 资讯部 邮箱:xiaoj@njb.swirebev.com 电话:025-58642091 与socket有关的一些函数介绍 1.读 ...
- 原始套接字--arp相关
arp请求示例 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <un ...
- 原始套接字--icmp相关
icmp请求 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <uni ...
- Python套接字编程(1)——socket模块与套接字编程
在Python网络编程系列,我们主要学习以下内容: 1. socket模块与基本套接字编程 2. socket模块的其他网络编程功能 3. SocketServer模块与简单并发服务器 4. 异步编程 ...
- [Socket网络编程]由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受。
原文地址:http://blog.sina.com.cn/s/blog_70bf579801017ylu.html,记录在此方便查看 解决办法: MSDN的说明: Close 方法可关闭远程主机连接, ...
- 套接字编程(VC_Win32)
简介(源于维基) Berkeley套接字(也作BSD套接字应用程序接口)刚开始是4.2BSD Unix操作系统(于1983发布)的一套应用程序接口.然而,由于AT&T的专利保护着UNIX,所以 ...
- 套接字工厂——ServerSocketFactory
接收器Acceptor在接收连接的过程中,根据不同的使用场合可能需要不同的安全级别,例如在支付相关的交易就必须对信息加密后再发送,这其中还涉及到密钥协商的过程,而在另外一些普通场合则无需对报文加密.反 ...
- TCP套接字端口复用SO_REUSEADDR
下面建立的套接字都是tcp套接字 1.进程创建监听套接字socket1,邦定一个指定端口,并接受了若干连接.那么进程创建另外一个套接口socket2,并试图邦定同一个端口时候,bind错误返回“Add ...
- IPC之套接字
IPC(Inter-Process Communication,进程间通信)实现方式 1)管道: - 管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程之间使用(进程的亲缘关系 ...
随机推荐
- 对Java的初识
什么是计算机程序: 为了让计算机执行某些操作或解决某个问题而编写的一系列有序指令的集合.(简单来说就是记算机为完成某些功能生产的一系列有序指令集合); Java的来历: Java的初期开发早在 ...
- 【Conclusion】MySQL使用
MySQL使用 因为数据库实验用到了MySQL,这里对现在已经涉及到的MySQL部分操作做一个简单的小结. 1.安装MySQL 上MySQL的官网下载对应自己OS平台的MySQL安装文件,有在线安装和 ...
- 笔记|《简明Python教程》:编程小白的第一本python入门书
<简明Python教程>这本书是初级的Python入门教材,初级内容基本覆盖,对高级内容没有做深入纠结.适合刚接触Python的新手,行文比较简洁轻松,读起来也比较顺畅. 下面是我根据各个 ...
- java集合系列——List集合之Vector介绍(四)
1. Vector的简介 JDK1.7.0_79版本 Vector 类可以实现可增长的对象数组.与数组一样,它包含可以使用整数索引进行访问的组件.但是,Vector 的大小可以根据需要增大或缩小,以适 ...
- #翻译#原文来自Database.System.Concepts(6th.Edition.2010)2.6Relational Operations,原文作者Abraham Silberschaz , Henry F. Korth , S. Sudarshan
2.6关系操作 所有的过程关系查询语言都提供一组操作,这些操作可以应用于单个关系或一对关系.这些操作具有良好的和期望的属性,它们的结果总是一个单一的关系.这个属性允许一个以模块化的方式组合其中的几个操 ...
- 从入门到精通之Boyer-Moore字符串搜索算法详解
本文讲述的是Boyer-Moore算法,Boyer-Moore算法作为字符串搜索算法,兴趣之下就想了解这个算法,发现这个算法一开始还挺难理解的,也许是我理解能力不是很好吧,花了小半天才看懂,看懂了过后 ...
- java数据库编程之嵌套子查询及exists的使用
第四章:高级查询(二) 4.1:exists和not exists子查询 4.1.1:exists子查询 用exists作为子查询的where条件 语法:select,,,,,,from 表名 w ...
- jQuery中下拉select、复选checkbox、单选radio的操作代码
//select $("#Icon") //对象 $("#Icon").val() //取值 $("#Icon").val("fa ...
- 详解m4文件
最近在分析speex代码,发现编译过程中需要的一个speex.m4文件不知道是何方神圣,怀着对未知知识的渴望,跑到 某哥和某基问了一下,算是认识了,为了方便以后经常见面,这里就做个记录吧. M4实际上 ...
- Java高新技术 Myeclipse 介绍
Java高新技术 Myeclipse 介绍 知识概述: (1)Myeclipse开发工具介绍 (2)Myeclipse常用开发步骤详解 ...