开头:半夜睡不着,想起来socket 网络通讯,这是闹哪门子。
一:网络通信
网络通讯本质上是用socket进行的。通讯嘛。本质上就是2个动作,读,写。
继续说下去之前,先来看如下一张图:

解释下图中的几个概念:
a. socket1,socket2,socket3
这是网络通讯的一个载体, 可以形象的理解为管道的端口。机器A和机器B建立网络链接之后,双方都会产生这个东西,以后双方通讯就靠它来传输数据。
b. 运输船
网络数据传输的基本单元(数据包)
c.码头A,码头B
操作系统(内核)管理的一片内存区域
d.货柜
传输数据的基本单位(不绝对严谨)。
e.仓库
socket 在内核的缓冲区,仓库有大有小。可以通过socket的相关属性来设置
程序员读写socket的时候,实际上就是从码头的仓库里取货或往码头的仓库里装货。
那问题来了。码头仓库里面的货物什么时候开始通过运输船运输呢?
这是由操作系统(内核)来管控的事情。简单理解: 至少运输船装满之后,才能通过运输船运输。
socket 通讯的基本流程是:
程序员A 通过--> socket1-> 不断的往它的码头仓库装货->操作系统(内核)根据规则 往运输船上装货柜 发送到 程序员B的码头仓库->
程序员B 在从它的码头仓库里面不断取货。
流程中的细节问题:
a. 程序员A的码头仓库和程序员B的码头仓库是必须一样大小吗?
不是必须的。通过socket 高级参数可以设置仓库大小
b. 程序员B什么时候开始从码头仓库中取货?
通过socket 的一些高级参数可以设置
c. 当程序员B的码头仓库堆满了, 程序员A 这边的状态会怎么样?
1. 当A的仓库未满时,A可以继续给B发送数据(其实是A继续往自己的仓库里面堆放货物)
2. 当A的仓库也满时,A就无法继续给B发送数据了。有2种结果,A给B发送数据出现阻塞。A给B发送数据出现异常信息。
d. 这种现象出现,就会产生A给B 发送数据的频率问题,B提取货物的能力问题,A,B仓库大小如何设定合理问题 等。
这也是socket 的一些高级问题。
总结: 通过上述形象举例,对socket编程有更加深刻的理解。同时也会产生各种疑问。带着这些疑问可以去查看TCP/IP 协议系列丛书,就更容易理解书中的内容。