套接字(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)管道: - 管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程之间使用(进程的亲缘关系 ...
随机推荐
- tomcat The specified JRE installation does not exist
window->perferences->server->installed runtimes 里tomcat删掉,重新建立服务,再运行
- 风趣的JavaScript面向对象入门课程一
在我们程序猿界一直流传这这么一个joke,没女票我们可以new一个.没房子没票子没车子我们同样new一个!当然这听着更像是一种自嘲,毕竟我们程序猿都爱自嘲,哈哈,废话不多说,今天就由我带着你们来入Ja ...
- struts2的防止表单重复提交
防止表单重复提交其实就是struts2的一个拦截器的使用: struts.xml配置文件: <?xml version="1.0" encoding="UTF-8& ...
- Python数据分析(二): Numpy技巧 (1/4)
In [1]: import numpy numpy.__version__ Out[1]: '1.13.1' In [2]: import numpy as np
- S2_OOP第三章
第一章 多态 概念 多态是具有表现多种型生态的能力的特征,同一个实现接口,使用不同的实例而执行不同的操作 子类转换父类(向上转型) 用父类接受子类,向上转型 向上转型的规则: 讲一个父类的引用志向一个 ...
- 深入理解C# 静态类与非静态类、静态成员的区别 [转载]
静态类 静态类与非静态类的重要区别在于静态类不能实例化,也就是说,不能使用 new 关键字创建静态类类型的变量.在声明一个类时使用static关键字,具有两个方面的意义:首先,它防止程序员写代码来实例 ...
- Python实战之IO多路复用select的详细简单练习
IO多路复用 I/O多路复用指:通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作. select 它通过一个select()系统调用来 ...
- Python之scrapy实例1
下文参考:http://www.jb51.net/article/57183.htm 个人也是稍加整理,修改其中的一些错误,这些错误与scrapy版本选择有关,个环境:Win7x64_SP1 + Py ...
- Jquery qTip2实现多种提示效果,支持ajax,以及多种样式
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- asp.net调用Lodop实现页面打印或局部打印,可进行打印设置或预览
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="WebPrint.aspx.cs ...