在自己学习过程在,发现了一个很不错的网站,本篇文章也是基于自己在这个网站学习后,想给自己学习过程增加一些印象,所以写点东西让自己记得更牢一点,想要更多的了解,可以多多支持站长的工作,分享不易。
感谢站长的辛勤奉献:http://c.biancheng.net/
文章目录
socket的定义
现在大学里面,只要是计算机相关专业,就离不开计算机网络这门课,里面会浅显的介绍一下socket,如果有幸学习了网络编程,会深入了解socket的含义以及用编程的方式实现计算机之间的通信。
socket在计算机术语上套接字的意思,事实上我们去翻译软件上查看,可以查出是插座的意思,顾名思义,我们从电厂获取电,是需要插头插上插座获取,而网络传输是将互联网插上socket进行数据传输。
事实上,目前绝多数的应用都会用到socket,浏览网页,看视频,聊天等等。
unix/linux下的socket
unix/linux本质上对文件的操作,所以为了区分各种文件,每个文件会有一个文件描述符。所以unix/linux下的socket也是一个文件,只要获取到socket的文件描述符,就和对普通文件的读操作和写操作没什么差别了。所以在unix/linux下,只要创建了socket连接,接下来就是文件操作。
windows下的socket
在windows下的socket就不是文件了,windows会将socket作为网络连接,所以会有专门的方法去执行socket
套接字的类型
套接字从大类上来说有很多的类型,其中最常见的就是internet的套接字,然后根据传输方式,分为两种
一种是流模式的socket,一种是数据报模式的socket
这里结合tcp和udp会更好理解
流模式的socket
Stream Sockets:面向连接的套接字(SOCK_STREAM)
特点:
- 数据传输的正确性
- 数据传输的有序性
- 数据的发送与接收的不同步
流模式的socket是基于TCP协议的,所以可以保证数据的有序且无误。
举两个站长的例子,可以把流模式比喻成传送带,只要传送带本身没有问题,也就是网络没有问题,传送带就不会丢失物品且有序传输。
假设传送带传输的是需要打包的物品,满100个打包一个,每次传输不需要到一个装一个,等满100后在打包,这就是接收与发送不同步的理解。在流套接字中有一个缓存,每次传输的数据可以先存到缓存中,缓存中的数据既可以分片读取,也可以装满后读取,所以传输和接收是不同步的。
应用:http协议就是基于流套接字,如果有一个出错,就会导致页面无法加载。
数据报模式的socket
Datagram Sockets:面向无连接的套接字(SOCK_DGRAM)
特点:
- 传输速率快而无序
- 数据可能丢失
- 传输大小有限制
- 传输与接收同步
因为不需要对数据的准确性进行校验,所以传输速率会快很多。
我们把数据报模式的socket比喻成快递小哥,在送快递的过程中不需要考虑顺序且速度要快,但是快递一直以来存在一定的分险,可能你的快递正在燃烧哦,所以会存在丢失损毁的可能,而且每次快递车的容量有限,交付客户是一对一准时接收,所以接收与发送的同步的。
数据报模式的socket是基于udp的,所以是一种不可靠的socket
应用:当我们在视频聊天的时候,我们要保证数据传输的速率,少量的丢包并不会影响通话的质量,所以使用数据报模式的socket。
面向连接和面向无连接套接字应用上的区别
这里我们假设一个互联网的连接图,其中H1~H6是计算机,A~E代表路由器
- 从H1->H6传送数据时,无连接的套接字在发送数据的时候,会将多个数据随机发送,每条路径都可能走一次,如果中途出现问题,那么就会出现丢包,所以无连接的套接字无法保证数据传输的质量。
- 同样的,在H1->H6传输数据,面向连接的会先确定一条路径,在传输数据的时候就按照这条路径来传,假设H1发送数据,H6没有回应,那么H1会在发送一次,保证传输的质量。但是这样的对资源的损耗也是很大的,传输速度自然就会慢。
osi七层网络模型
概述
这里这是对七层模型的简单概述
从下至上:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层
功能:对数据进行封装
我们使用软件的时候,是通过应用层来访问,程序产生的数据 通过一层一层的包装,等到达互联网的时候,就会得到一个封装 的数据。
当接收数据的时候,我们会一层一层的拆开包装,最后得到应用的数据。
所以说,包装数据的时候,是从应用层到物理层,拆分数据的时候是从物理层到应用层。
通信原则:
- 同一层数据进行通信,比如应用层和传输层就不可以。
- 必须是相同的网络模型
- 数据只能逐层传输,不能越层。
协议
在每一层中都有很多的协议,协议的作用是就是通信双方必须遵守的协议,例如在传输层有tcp,udp,网络层有ip,大大小小的协议有几百种,规范了计算机网络。
开放式的系统将各个厂商的路由器,网卡等硬件设备统一起来,通信过程中就不需要去使用相同的硬件了,也是一种标准化。
ip,mac,端口
ip地址
一台计算机拥有一个ip地址,通信的时候通过ip地址找到目标计算机
mac地址
不只是一个计算机拥有一个ip地址,一个局域网也可以拥有一个ip地址,但是局域网内有多台电脑,如何定位到其中的一台的计算机,就需要mac地址,每一个网卡的mac地址是独一无二的,mac地址也称物理地址,因为mac地址在出厂的时候就写死在里面了。
端口号
有了ip地址和mac地址,我们可以找到哪一台计算机,但是还需要找到对应的网络服务,才能进行通信,有了ip和mac,可以给计算机发送数据包,但是数据包交给谁处理,却不知道,所以通信还是失败的。为此,计算机为每一个网络服务提供端口号,这样就可以找到对应的网络服务。端口号是逻辑上的,是由计算机分配的。
tcp的三次握手
socketA:我要传数据了
socketB:好的,我知道了
scoketA:行,我知道你确定接收了
下图是数据包的结构:
- 序号seq:用来标记发送数据包的序号
- 确认号ack:ack=seq+1
- 标志位:
-
- URG:紧急指针(urgent pointer)有效
-
- ACK:确认序号有效
-
- PSH:接收方应该尽快将这个报文交给应用层
-
- RST:重置连接
-
- SYN:建立一个新连接
-
- FIN:断开一个连接
建立连接后相互发三个包
ack还与字节数有关,所以Ack号 = Seq号 + 传递的字节数 + 1,防止丢包
- FIN:断开一个连接
tcp的四次挥手
socketA:我要断开连接了
socketB:好的,稍等一下
socketB:可以断开了
socketA:好的我知道了
四次挥手是为了保证所有的数据都传输完毕之后在关闭连接