zoukankan      html  css  js  c++  java
  • socket基本概念

     1.socket 是什么?

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

      2.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() 创建了连接,剩下的就是文件操作了,网络编程原来就是如此简单!

      3.套接字的类型

      <1>流格式套接字(基于TCP)

       SOCK_STREAM 是一种面向连接的、可靠的、双向的通信数据流,数据可以准确无误地到达另一台计算机,如果损坏或丢失,可以重新发送。

       SOCK_STREAM 有以下几个特征:

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

        <2>数据报格式套接字(基于UDP)

         SOCK_DGRAM 是无连接的不可靠的,不会进行数据的检查  

        它有以下特征:

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

       4.面向连接套接字与无连接套接字的区别

      《1》无连接的套接字

      • 数据包的路径随意
      • 受到:路径长短开销、路径拥堵、路由排队时延(可能丢包)的影响
      • 尽力而为
      • 传输效率高,但是不可靠,有丢失数据包、捣乱数据的风险

        《2》面向连接的套接字

      • 在发送方和接收方之间建立链路(虚电路)
      • 数据按顺序的可靠传输
      • 非常可靠,万无一失,传输效率低,耗费资源多

      5.OSI七层网络模型和TCP/IP的四层模型

    应用层  应用层
    表示层
    会话层
    传输层 传输层
    网络层 网络层
    数据链路层 网络接口
    物理层

      两台计算机进行通信时,必须遵守以下原则:

    • 必须是同一层次进行通信,比如,A 计算机的应用层和 B 计算机的传输层就不能通信,因为它们不在一个层次,数据的拆包会遇到问题。
    • 每一层的功能都必须相同,也就是拥有完全相同的网络模型。如果网络模型都不同,那不就乱套了,谁都不认识谁。
    • 数据只能逐层传输,不能跃层。
    • 每一层可以使用下层提供的服务,并向上层提供服务。

      我们所说的 socket 编程,是站在传输层的基础上,所以可以使用 TCP/UDP 协议,但是不能干「访问网页」这样的事情,因为访问网页所需要的 http 协议位于应用层。

      6.TCP/IP 协议簇

      TCP/IP 模型包含了 TCP、IP、UDP、Telnet、FTP、SMTP 等上百个互为关联的协议,其中 TCP 和 IP 是最常用的两种底层协议,所以把它们统称为“TCP/IP 协议族”。

      也就是说,“TCP/IP模型”中所涉及到的协议称为“TCP/IP协议族”,你可以区分这两个概念,也可以认为它们是等价的

      socket 编程是基于 TCP 和 UDP 协议的,它们的层级关系如下图所示:

          TCP/IP协议的层次图

      7.IP、MAC和端口号——网络通信中确认身份信息的三要素

      <1>IP地址:一般一个局域网用一个IP地址(公网地址:买的),因为IPV4地址如果一台计算机一个肯定不够用 

      <2>MAC地址:固定的写在网卡上

      <3>端口号:应用层程序的接口

      本文参考:C语言中文网   http://c.biancheng.net/view/2128.html

  • 相关阅读:
    树莓派镜像拷贝
    zookeeper客户端Watcher管理
    设置ZooKeeper服务器地址列表源码解析及扩展
    利用zookeeper实现发布订阅模式
    maven依赖错误排查经验
    理解CMS GC日志
    深入分析ThreadLocal
    Fail-Fast分析
    Stream学习过程中遇到的一个问题记录
    ClassLoader 学习笔记
  • 原文地址:https://www.cnblogs.com/zgqcn/p/10815778.html
Copyright © 2011-2022 走看看