Socket网络编程基础

声明: 本篇博客的学习途径主要为以下网站和课堂讲解,发博客目的仅为学习使用
http://c.biancheng.net/socket/


socket 通信技术就是两台联网的计算机之间交换数据的技术

什么是socket?

socket 的原意是“插座”,在计算机通信领域,socket 被翻译为“套接字”,通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。
最经典的应用是Web服务器和浏览器之间的数据传递。

在这里插入图片描述


Linux中的socket

UNIX/Linux 中的一切都是文件!
为了区分已经打开的文件,UNIX/Linux 会给每个文件分配一个 ID,这个 ID 就是一个整数,被称为文件描述符(File Descriptor)

  • 通常用 0 来表示标准输入文件(stdin),它对应的硬件设备就是键盘;
  • 通常用 1 来表示标准输出文件(stdout),它对应的硬件设备就是显示器。
    UNIX/Linux 程序在执行任何形式的 I/O 操作时,都是在读取或者写入一个文件描述符
    文件是一个硬盘上的普通文件、FIFO、管道、终端、键盘、显示器,甚至是一个网络连接。
    请注意,网络连接也是一个文件,它也有文件描述符!
    我们可以通过 socket() 函数来创建一个网络连接,或者说打开一个网络文件,socket() 的返回值就是文件描述符。有了文件描述符,我们就可以使用普通的文件操作函数来传输数据了,例如:
  • 用 read() 读取从远程计算机传来的数据;
  • 用 write() 向远程计算机写入数据。

套接字(socket)的类型

这个世界上有很多种套接字(socket),之后主要讲解的是Internet套接字

  • DARPA Internet 地址(Internet 套接字)
  • 本地节点的路径名(Unix套接字)
  • CCITT X.25地址(X.25 套接字)
  • Internet 套接字

之后所有的Internet socket 简称为socket


Internet socket的分类

在这里插入图片描述


流格式套接字(SOCK_STREAM)

流格式套接字(SOCK_STREAM):面向连接的套接字,在代码中使用SOCK_STREAM表示

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


流格式套接字(SOCK_STREAM)的特征

SOCK_STREAM 有以下几个特征:

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

流格式套接字(SOCK_STREAM)采用的协议
  • 流格式套接字(SOCK_STREAM)为什么是高质量的可靠传输呢?
    因为使用到了TCP/IP协议(The Transmission Control Protocol,传输控制协议)
    TCP 用来确保数据的正确性
    IP(Internet Protocol,网络协议)用来控制数据如何从源头到达目的地,也就是常说的“路由”。

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

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


流格式套接字(SOCK_STREAM)实际的应用场景
  • 流格式套接字(SOCK_STREAM)实际的应用场景有哪些?
    浏览器使用的HTTP协议,HTTP协议就是基于面向连接的套接字,必须保证数据准确无误,否则加载的HTML将无法解析。

数据报格式套接字(SOCK_DGRAM)

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

使用数据报格式套接字,只传递数据,不作数据校验,数据错了就错了照传不误,无法重传。


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

由于其发送和接收是同步的,所以限制了传输的数据大小,类比于摩托车,用两辆摩托车分别发送两件包裹,那么接收者也需要分两次接收。

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

数据报套接字是一种不可靠的、不按顺序传递的、以追求速度为目的的套接字


数据报格式套接字(SOCK_DGRAM))采用的协议

数据报套接字也使用 IP 协议作路由,使用 UDP 协议(User Datagram Protocol,用户数据报协议)。


数据报格式套接字(SOCK_DGRAM))实际的应用场景

QQ 视频聊天和语音聊天就使用 还有 DNS、即时聊天工具
SOCK_DGRAM 来传输数据,因为首先要保证通信的效率,尽量减小延迟,而数据的正确性是次要的,即使丢失很小的一部分数据,视频和音频也可以正常解析,最多出现噪点或杂音,不会对通信质量有实质的影响。

注意:SOCK_DGRAM 没有想象中的糟糕,不会频繁的丢失数据,数据错误只是小概率事件。


面向连接和无连接的套接字

流格式套接字(Stream Sockets)就是“面向连接的套接字”,它基于 TCP 协议;
数据报格式套接字(Datagram Sockets)就是“无连接的套接字”,它基于 UDP 协议。

实际举例(简化的互联网模型):
在这里插入图片描述
H1 ~ H6 表示计算机,A~E 表示路由器,发送端发送的数据必须经过路由器的转发才能到达接收端。
假设 H1 要发送若干个数据包给 H6,那么有多条路径可以选择,比如:

路径①:H1 --> A --> C --> E --> H6
路径②:H1 --> A --> B --> E --> H6
路径③:H1 --> A --> B --> D --> E --> H6
路径④:H1 --> A --> B --> C --> E --> H6
路径⑤:H1 --> A --> C --> B --> D --> E --> H6

数据包的传输路径是路由器根据算法来计算出来的,算法会考虑很多因素,比如网络的拥堵状况、下一个路由器是否忙碌等。


无连接的套接字

对于无连接的套接字,数据包在传输过程中会发生各种不测,也会发生各种奇迹。H1 只负责把数据包发出,至于它什么时候到达,先到达还是后到达,有没有成功到达,H1 都不管了;H6 也没有选择的权利,只能被动接收,收到什么算什么,爱用不用。

每个数据包之间都是独立的,各走各的路,谁也不影响谁,除了迷路的或者发生意外的数据包,最后都能到达 H6。但是,到达的顺序是不确定的,比如:
⭐第一个数据包选择了一条比较长的路径(比如路径⑤),第三个数据包选择了一条比较短的路径(比如路径①),虽然第一个数据包很早就出发了,但是走的路比较远,最终还是晚于第三个数据包达到。
⭐第一个数据包选择了一条比较短的路径(比如路径①),第三个数据包选择了一条比较长的路径(比如路径⑤),按理说第一个数据包应该先到达,但是非常不幸,第一个数据包走的路比较拥堵,这条路上的数据量非常大,路由器处理得很慢,所以它还是晚于第三个数据包达到了。

还有一些意外情况会发生,比如:
⭐ 第一个数据包选择了路径①,但是路由器C突然断电了,那它就到不了 H6 了。
⭐ 第三个数据包选择了路径②,虽然路不远,但是太拥堵,以至于它等待的时间太长,路由器把它丢弃了。
还有一些意外情况会发生,比如:
第一个数据包选择了路径①,但是路由器C突然断电了,那它就到不了 H6 了。
第三个数据包选择了路径②,虽然路不远,但是太拥堵,以至于它等待的时间太长,路由器把它丢弃了。

无连接套接字遵循的是「尽最大努力交付」的原则,就是尽力而为,实在做不到了也没办法。无连接套接字提供的没有质量保证的服务。

  • 无连接的套接字数据包里都有什么?
    无连接的套接字则只包含长度校验和信息。

面向连接的套接字

在这里插入图片描述

①面向连接的套接字在正式通信之前要先确定一条路径,该路径被称为“虚电路”,就是一条虚拟的通信电路。没有特殊情况的话,以后就固定地使用这条路径来传递数据包了。该路径由路由器维护的,路径上的所有路由器都要存储该路径的信息(实际上只需要存储上游和下游的两个路由器的位置就行),所以路由器是有开销的。

②发送端在发送数据包以后,必须得到接收端的确认才发送下一个数据包;如果数据包发出去了,一段时间以后仍然没有得到接收端的回应,那么发送端会重新再发送一次,直到得到接收端的回应。
通信完毕后,要断开连接,销毁路径,这个时候路由器也会把之前存储的路径信息擦除

  • 发送端发送一个数据包,如何得到接收端的确认呢?
    为每一个数据包分配一个 ID,接收端接收到数据包以后,再给发送端返回一个数据包,告诉发送端我接收到了 ID 为 xxx 的数据包。

  • 为什么面向连接的套接字数据包那么多?
    面向连接的套接字会比无连接的套接字多出很多数据包,因为发送端每发送一个数据包,接收端就会返回一个数据包。此外,建立连接和断开连接的过程也会传递很多数据包

  • 数据包里都有什么?
    除了源端口目的端口,面向连接的套接字还包括序号ID确认信号数据偏移控制标志(通常说的 URG、ACK、PSH、RST、SYN、FIN)、窗口校验和紧急指针选项等信息;


OSI网络七层模型

OSI 是 Open System Interconnection 的缩写,译为“开放式系统互联”
口诀:物联网输会示用
OSI进行简化: TCP/IP模型
口诀:接网传用
在这里插入图片描述

  • 网络模型的作用? : 进行数据封装
    数据传输本质是一个装包-拆包的过程,不断增加头部的数据块。

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

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

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

TCP/IP协议族

协议(Protocol):就是网络通信过程中的约定或者合同,通信的双方必须都遵守才能正常收发数据。协议有很多种,例如 TCP、UDP、IP 等,通信的双方必须使用同一协议才能通信

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

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

在这里插入图片描述


网络通信中确认身份信息的三要素(IP、MAC、端口号)

在茫茫的互联网海洋中,要找到一台计算机非常不容易,有三个要素必须具备,它们分别是 IP 地址、MAC 地址和端口号


IP地址

IP地址是 Internet Protocol Address 的缩写,译为“网际协议地址”。
一台计算机可以拥有一个独立的 IP 地址,一个局域网也可以拥有一个独立的 IP 地址(对外就好像只有一台计算机)。
现实情况往往是一个局域网才拥有一个 IP 地址。

在因特网上进行通信时,必须要知道对方的 IP 地址。实际上数据包中已经附带了 IP 地址,把数据包发送给路由器以后,路由器会根据 IP 地址找到对方的地里位置,完成一次数据的传递。


MAC地址

一个局域网往往才能拥有一个独立的 IP;换句话说,IP 地址只能定位到一个局域网,无法定位到具体的一台计算机。这可怎么办呀?
真正能唯一标识一台计算机的是 MAC 地址,MAC地址也叫做真实物理地址 MAC 地址是 Media Access Control Address 的缩写,直译为“媒体访问控制地址”
局域网中的路由器/交换机记录每台计算机的 MAC 地址。


端口号

有了 IP 地址和 MAC 地址,虽然可以找到目标计算机,但仍然不能进行通信,计算机虽然可以正确接收到数据包,但是却不知道要将数据包交给哪个网络程序来处理,一台计算机可以同时提供多种网络服务,例如 Web 服务(网站)、FTP 服务(文件传输服务)、SMTP 服务(邮箱服务)等。
端口号:为每个网络程序分配一个独一无二的端口号(Port Number)
例如,Web 服务的端口号是 80,FTP 服务的端口号是 21,SMTP 服务的端口号是 25。
端口(Port)是一个虚拟的、逻辑上的概念。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值