网络套接字socket的简介

以下内容源于C语言中文网的学习与整理,非原创,如有侵权请告知删除。

总结

socket的中文翻译是“套接字”,它是计算机之间进行通信的一种约定或一种方式。

套接字的典型应用就是web服务器和浏览器。

在Unix/Linux中,网络连接也是一个文件,遵循文件I/O操作的流程。

套接字按照数据传输方式分为:面向连接的套接字(流格式套接字),无连接的套接字(数据报格式套接字)

面向连接的套接字可以保证可靠的数据传输,因为它使用的是TCP协议。

无连接的套接字能够高效地传输数据,但不确保数据的可靠,它使用的是UDP协议。

一、socket是什么

1、socket的含义

socket 的原意是“插座”,在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。

我们把插头插到插座上就能从电网获得电力供应,同样,为了与远程计算机进行数据传输,需要连接到因特网,而 socket 就是用来连接到因特网的工具。
 


socket 的典型应用就是 Web 服务器和浏览器:浏览器获取用户输入的 URL,向服务器发起请求,服务器分析接收到的 URL,将对应的网页内容返回给浏览器,浏览器再经过解析和渲染,就将文字、图片、视频等元素呈现给用户。

学习 socket,也就是学习计算机之间如何通信,并编写出实用的程序。

2、UNIX/Linux 中的socket

在 UNIX/Linux 系统中,为了统一对各种硬件的操作,简化接口,不同的硬件设备也都被看成一个文件。对这些文件的操作,等同于对磁盘上普通文件的操作。

你也许听很多高手说过,UNIX/Linux 中的一切都是文件!那个家伙说的没错。

为了表示和区分已经打开的文件,UNIX/Linux 会给每个文件分配一个 ID,这个 ID 就是一个整数,被称为文件描述符(File Descriptor)。例如:

  • 通常用 0 来表示标准输入文件(stdin),它对应的硬件设备就是键盘;
  • 通常用 1 来表示标准输出文件(stdout),它对应的硬件设备就是显示器。

UNIX/Linux 程序在执行任何形式的 I/O 操作时,都是在读取或者写入一个文件描述符。一个文件描述符只是一个和打开的文件相关联的整数,它的背后可能是一个硬盘上的普通文件、FIFO、管道、终端、键盘、显示器,甚至是一个网络连接。请注意,网络连接也是一个文件,它也有文件描述符!

我们可以通过 socket() 函数来创建一个网络连接,或者说打开一个网络文件,socket() 的返回值就是文件描述符。有了文件描述符,我们就可以使用普通的文件操作函数来传输数据了,例如:

  • 用 read() 读取从远程计算机传来的数据;
  • 用 write() 向远程计算机写入数据。

只要用 socket() 创建了连接,剩下的就是文件操作了,网络编程原来就是如此简单!

二、socket有哪些分类

这个世界上有很多种套接字,比如 DARPA Internet 地址(Internet 套接字)、本地节点的路径名(Unix套接字)、CCITT X.25地址(X.25 套接字)等。其中 Internet 套接字是最具代表性的,也是最经典最常用的。以后我们提及套接字,指的都是 Internet 套接字。

根据数据的传输方式,可以将 Internet 套接字分成两种类型:面向连接的套接字、无连接的套接字

通过 socket() 函数创建连接时,必须告诉它使用哪种数据传输方式。 

1、流格式套接字(SOCK_STREAM)

流格式套接字(Stream Sockets)也叫“面向连接的套接字”,在代码中使用 SOCK_STREAM 表示。

SOCK_STREAM 是一种可靠的、双向的通信数据流,数据可以准确无误地到达另一台计算机,如果损坏或丢失,可以重新发送。它有以下几个特征:

  • 数据在传输过程中不会消失;
  • 数据是按照顺序传输的;
  • 数据的发送和接收不是同步的(有的教程也称“不存在数据边界”)。

可以将 SOCK_STREAM 比喻成一条传送带,只要传送带本身没有问题(不会断网),就能保证数据不丢失;同时,较晚传送的数据不会先到达,较早传送的数据不会晚到达,这就保证了数据是按照顺序传递的。
 


为什么流格式套接字可以达到高质量的数据传输呢?

这是因为它使用了 TCP 协议(The Transmission Control Protocol,传输控制协议),TCP 协议会控制你的数据按照顺序到达并且没有错误。

你也许见过 TCP,是因为你经常听说“TCP/IP”。TCP 用来确保数据的正确性,而IP(Internet Protocol,网络协议)用来控制数据如何从源头到达目的地,即常说的“路由”。

那么,“数据的发送和接收不同步”该如何理解呢?

假设传送带传送的是水果,接收者需要凑齐 100 个后才能装袋,但是传送带可能把这 100 个水果分批传送,比如第一批传送 20 个,第二批传送 50 个,第三批传送 30 个。接收者不需要和传送带保持同步,只要根据自己的节奏来装袋即可,不用管传送带传送了几批,也不用每到一批就装袋一次,可以等到凑够了 100 个水果再装袋。

流格式套接字的内部有一个缓冲区(也就是字符数组),通过 socket 传输的数据将保存到这个缓冲区。接收端在收到数据后并不一定立即读取,只要数据不超过缓冲区的容量,接收端有可能在缓冲区被填满以后一次性地读取,也可能分成好几次读取。

也就是说,不管数据分几次传送过来,接收端只需要根据自己的要求读取,不用非得在数据到达时立即读取。传送端有自己的节奏,接收端也有自己的节奏,它们是不一致的。

流格式套接字有什么实际的应用场景吗?

浏览器所使用的 http 协议就基于面向连接的套接字,因为必须要确保数据准确无误,否则加载的 HTML 将无法解析。

2、数据报格式套接字(SOCK_DGRAM)

数据报格式套接字(Datagram Sockets)也叫“无连接的套接字”,在代码中使用 SOCK_DGRAM 表示。

计算机只管传输数据,不作数据校验,如果数据在传输中损坏,或者没有到达另一台计算机,是没有办法补救的。也就是说,数据错了就错了,无法重传。

因为数据报套接字所做的校验工作少,所以在传输效率方面比流格式套接字要高。

可以将 SOCK_DGRAM 比喻成高速移动的摩托车快递,它有以下特征:

  • 强调快速传输而非传输顺序;
  • 传输的数据可能丢失也可能损毁;
  • 限制每次传输的数据大小;
  • 数据的发送和接收是同步的(有的教程也称“存在数据边界”)。

众所周知,速度是快递行业的生命。用摩托车发往同一地点的两件包裹无需保证顺序,只要以最快的速度交给客户就行。这种方式存在损坏或丢失的风险,而且包裹大小有一定限制。因此,想要传递大量包裹,就得分配发送。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/460657.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IP、MAC和端口号

以下内容源于C语言中文网资料的学习与整理,非原创,如有侵权请告知删除。 在茫茫的互联网海洋中,要找到一台计算机非常不容易,有三个要素必须具备,它们分别是 IP 地址、MAC 地址和端口号。 IP地址 IP地址是 Internet Pr…

UML概述

UML视频一直在看,但是总觉得没有什么思路,知识都是零散的、片面的。最后复习阶段老师重新理了一下思路,我才觉得有点清晰了。所以,又回头把UML概述部分总结了一下。 感慨一句:思维导图真的要勤画,画图也是在…

TCP/IP模型简介(OSI模型的简化版)

以下内容源于C语言中文网的学习与整理,如有侵权请告知删除。 一、TCP/IP模型 1、模型的概念 OSI 是 Open System Interconnection 的缩写,译为“开放式系统互联”。OSI 模型把网络通信的工作分为 7 层,从下到上分别是物理层、数据链路层、网络…

图解TCP数据的传输(建立连接、数据传输、断开连接)

以下内容源于C语言中文网的学习与整理,非原创,仅作学习之用,如有侵权请告知删除。 TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的通信协议,数据在传…

自定义Button,复写里面的onKeyDown,不起作用

李刚的Android疯狂讲义真是“疯狂”,浪费了3天时间,到底是他的代码有问题,还是怎么的不得而知。 问题描述:他的书里面第3.3基于回调事件处理Propagation的例程。是为了演示基于回调事件传播的例程序,源代码如下&#x…

与socket网络编程有关的函数

以下内容源于网络资源的学习与整理,如有侵权请告知删除。 基于TCP通信的服务模式 服务端 socket函数,获取网络连接的文件描述符 bind函数,将服务器的端口、ip地址与socket函数创建的文件描述符绑定 listen函数,监听服务器的当前端…

转载Linq中GroupBy方法的使用总结

Group在SQL经常使用,通常是对一个字段或者多个字段分组,求其总和,均值等。 Linq中的Groupby方法也有这种功能。具体实现看代码: 假设有如下的一个数据集: public class StudentScore { public int ID { se…

在Atom中运行脚本

2019独角兽企业重金招聘Python工程师标准>>> 现在可以在atom官网(https://atom.io/)找到deb包。 插件script可以让atom运行脚本,具体请见:https://atom.io/packages/script。 下面大致讲一下如何使用。 安装atom后&…

js中的this

在面向对象编程语言中,对于this关键字我们是非常熟悉的。比如C、C#和Java等都提供了这个关键字,虽然在开始学习的时候觉得比较难,但只要理解了,用起来是非常方便和意义确定的。JavaScript也提供了这个this关键字,不过用…

在 Windows Azure 上部署并定制化 FreeBSD 虚拟机镜像

发布于 2014-12-11作者 陈阳FreeBSD 基础镜像现已登陆中国的 VM Depot! 对于青睐 BSD 而非 Linux 的开源爱好者来说,这无疑是个好消息。同时,随着该基础镜像的可用,我们期待很快看到更多来自社区的基于 F…

如何理解套接字的形容词前缀:“面向连接”与“无连接”

以下内容源于C语言中文网资料的学习与整理,非本人原创,如有侵权请告知删除。 前言 在《网络套接字socket的简介》一文中提到,流格式套接字(Stream Sockets)就是“面向连接的套接字”,它基于 TCP 协议&…

文件IO——Linux系统如何管理文件

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。 硬盘中的静态文件 文件平时以一种固定的形式存放在硬盘中,我们叫它静态文件。 一块硬盘中可以分为两大区域:一个是硬盘内容管理表,另一个是真正存储内容的区域。 …

java String类 常用函数

为什么80%的码农都做不了架构师?>>> 1. 获取 int indexOf(int c) int indexOf(int c, int start) char charAt(int index) 2.判断 判断是否包含一个字符串 boolean contains(CharSequence cs) indexOf() //也可以用来判断是否包含 判断是否有内容 boole…

设备驱动程序的简介

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。 一、驱动的概念 设备驱动程序(Device Driver),简称驱动程序、驱动(Driver),指操作系统中用来操控硬件的代码。 驱动是硬件与操…

Android开发实践:掌握Camera的预览方向和拍照方向

Android的Camera相关应用开发中,有一个必须搞清楚的知识点,就是Camera的预览方向和拍照方向,本文就重点讨论一下这个问题。图像的Sensor方向:手机Camera的图像数据都是来自于摄像头硬件的图像传感器(Image Sensor&…

SecureCRT显示乱码的解决办法

发现问题 在Ubuntu中编写代码,输出语句里带有中文,比如"printf("读出来的内容是:%s.\n", buf);"。使用交叉编译工具链编译后,将可执行程序转移至开发板系统运行,并使用SCRT来观测测试结果。此时发…

WCF数据契约

当使用DataMember时,和访问符无关,及时使用了private,成员都是可见的。相反如果使用static,为不可见。 上述的两个数据成员是等效的,如果是等效的话 数据成员的顺序也必须是相同的。 4.数据契约已知类型——使用KownTy…

spring mvc 配置解析之xml

2019独角兽企业重金招聘Python工程师标准>>> ##mvc.xml中可配置的元素## 既然是xml,当然是要遵循schema的规定. 那么schema文件在哪呢? 定位方法就是解开这个jar文件,找到META-INF/spring.schema文件,这是个文本文件,里面包含了namespace以及其对应的xsd文件的位置…

JDBC学习笔记——事务、存储过程以及批量处理

2019独角兽企业重金招聘Python工程师标准>>> 1、事务 1.1、事务的基本概念和使用示例 数据库事务,是指作为单个逻辑工作单元执行的一系列操作,要么完整…

验证码识别笔记(二)

这是验证码识别的第二篇,先看一下样图吧,就是下面那张。 看到这张图片,直观上就知道比第一篇中的要简单,这个“简单”用语言来描述,可以得到下面的几条结论: 1. 图片中的字符边界比较清晰,并且单…