码迷,mamicode.com
首页 > 系统相关 > 详细

套接字(linux相关)

时间:2017-11-05 00:26:34      阅读:284      评论:0      收藏:0      [点我收藏+]

标签:user   tcp的三次握手   log   套接字   logs   链接   tcp   use   ssh   

 

前言:略

一、前因

  一切从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相关)

标签:user   tcp的三次握手   log   套接字   logs   链接   tcp   use   ssh   

原文地址:http://www.cnblogs.com/Forestes/p/7784956.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!