2-2:套接字(Socket)编程之深入了解套接字

Posted 快乐江湖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2-2:套接字(Socket)编程之深入了解套接字相关的知识,希望对你有一定的参考价值。

(1)Socket背景知识

在 80 年代早期,远景研究规划局(Advanced Research Projects Agency, ARPA)资助了佳利福尼亚大学伯克利分校的一个研究组,让他们将 TCP/IP 软件移植到 UNIX 操作系统中,并将结果提供给其他网点。作为项目的一部分,设计者们创建了一个接口,应用进程使用这个接口可以方便的进行通信。他们决定,只要有可能就使用以有的系统调用,对那些不能方便的容入已有的函数集的情况,就再增加新的系统调用以支持 TCP/IP 功能。这样做的结果就出现了插口接口(Berkeley Socket),这个系统被称为 Berkeley UNIX或 BSD UNIX。(TCP/IP 首次出现在 BSD 4.1 版本 release 4.1 of Berkeley SoftwareDistribution)。由许多计算机厂商,都采用了 Berkeley UNIX,于是许多机器上都可以使用 Socket 了。这样,Socket 接口就被广泛使用,到现在已经成为事实上的标准。

在这里插入图片描述

(2)深入了解套接字

套接字英文愿意为插座,孔的意思,但是这里却把它翻译为“套接字”,是在让人不太理解。

在Linux系统编程中我们知道,如果想要把内容打印到屏幕上,或者写入到硬盘中,就必然要借助系统调用接口,或者称其为“陷入内核
在这里插入图片描述
那么现在到了网络了,我们要借助网络实现不同主机的进程相互通信,根据TCP/IP分层模型,可以看到我们绝大部分能做的操作都在应用层,传输层开始以下均属于操作系统。
在这里插入图片描述
当网卡收到数据后,不断向上分用,最后通过应用层拿到自己的数据,其中传输层属于操作系统,这也就意味着想要处理数据就必须要明白TCP/IP的协议操作和相关复杂的系统调用接口,这很显然使很繁琐的。

同时前文说过,IP地址+端口号可以标识全网唯一的一个进程,所在在标识好进程后,我们熟知的socket就是把TCP/IP层复杂的操作抽象为了几个简单的接口以供应用层调用,以此来实现进程通信。
在这里插入图片描述

因此socket是介于应用层和传输层之间的一个抽象层,或者称他为一种通信机制。套接字以上的进程是受应用程序控制的,其以下的传输层协议则是受操作系统控制。因此,只要应用程序使用TCP/IP协议进行通信,它就必须要通过套接字与操作系统进行交互。所以对于开发者来说,他只需要关心这层抽象层,不需要关系传输层复杂的操作,当然它所能操作的权限或者范围就没有TCP/IP直接操作的范围大了。如socket不可以选择某些传输层的参数(比如最大缓存空间和最大报文长度等等)
在这里插入图片描述

所以服务器就像一个大插排,包含很多插座,客户端就是像一个插头,每一个进程代表一条电线,客户端将电线的插头插到服务器插排上对应的插座上,就可以开始通信了。
在这里插入图片描述
套接字是应用程序为了获得网络通信服务而与操作系统进行交互时使用的一种机制: 当应用程序需要使用网络进行通信时,必须首先发出socket系统调用,请求操作系统为其创建一个套接字。此调用的实际效果是请求操作系统把网络通信中所需的一些系统资源(比如CPU时间,网络带宽等),分配给该程序。操作系统用套接字描述符(实则是一个小的整数)来表示这些资源的总和,然后该套接字描述符会返回给该进程,此后应用程序所有的网络操作(比如收发数据)都要使用这个套接字描述符(就像用open打开文件获得的一个文件描述符,然后writeread都要使用到这个描述符)。在处理系统调用的时候,通过套接字描述符,操作系统就可以识别出应该使用哪些资源来完成应用程序所请求的服务。通信结束后,会调用close系统调用让操作系统回收与该套接字相关的所有资源。在这里插入图片描述

(3)套接字的三种类型

套接字有三种类型:流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM)及原始套接字。

A:流式套接字(SOCK_STREAM)

流式的套接字可以提供可靠的、面向连接的通讯流——TCP套接字编程

在这里插入图片描述

B:数据包套接字(SOCK_DGRAM)

数据报套接字定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证可靠,无差错——UDP套接字编程
所谓的不可靠就是指

  • 如果你发送了一个数据报,它可能不会到达。
  • 它可能会以不同的顺序到达。
  • 如果它到达了,它包含的数据中可能存在错误。
    在这里插入图片描述

C:原始套接字

原始套接字主要用于一些协议的开发,可以进行比较底层的操作。它功能强大,但是没有上面介绍的两种套接字使用方便,一般的程序也涉及不到原始套接字。

以上是关于2-2:套接字(Socket)编程之深入了解套接字的主要内容,如果未能解决你的问题,请参考以下文章

socket网络编程:什么是socket(套接字)

Java TCP/IP Socket深入剖析socket——数据传输的底层实现

网络编程之socket编程

网络编程socket套接字及其使用

网络编程(待补充)

2-3:套接字(Socket)编程之UDP通信,sockaddr,sockaddr_in,recvfrom,sendto