前言
对于面试来说, 计算机网络几乎是必问的内容, 而其中的应用层的HTTP和传输层的TPC/UDP更是重中之重.
学习TCP的时候总是会或多或少的遇到socket这个东西, 那么这究竟是个啥呢?
so, 新的系列开始喽
一. socket基本知识
socket 是啥?
英文原意: 插座, 插口, 窝槽
计算机领域称为: 套接字
socket 是干嘛的?
百度词条: 内核(kernel)利用文件描述符(file descriptor)来访问文件。文件描述符是非负整数。打开现存文件或新建文件时,内核会返回一个文件描述符。读写文件也需要使用文件描述符来指定待读写的文件。
在Unix/Linux中, 为了统一对各种硬件的操作, 简化接口, 不同的设备也被看成一个文件, 对这些文件的操作, 等同于对磁盘上普通文件的操作
为了表示和区分已经打开的文件, Unix/Linux会给每个文件分配一个整数ID, 被称为文件描述符(File Descriptor)
我们可以通过 socket() 函数来创建一个网络连接,或者说打开一个网络文件,socket() 的返回值就是文件描述符.
有了文件描述符,我们就可以使用普通的文件操作函数来传输数据了
要注意Windows和Linux中socket的区别:
流格式套接字也叫”面向连接的套接字”, 注意使用的时候不可小写
SOCK_STREAM 是一种可靠的, 双向的通信数据流, 数据可以准确无误的送到, 如果损坏或者丢失, 可以重新发送
流格式套接字有自己的纠错机制
SOCK_STREAM 有以下几个特征:
- 数据在传输过程中不会消失
- 数据是按照顺序传输的
- 数据的发送和接受不是同步的(通俗理解: 装100个苹果, 我们可以往袋子里装, 也可以等一等, 每次攒够10个再装袋, 完成”攒”这个动作的就是缓冲区(字符数组), 也就是说, 数据到达了, 我们不需要立刻读取)
流格式套接字的应用场景
HTTP
数据报格式套接字(SOCK_DGRAM)–基于UDP
数据报格式套接字也叫”无连接的套接字”.
计算机只管传输数据, 不做数据校验, 丢了就丢了, 错了就错了, 无法重传, 但是其实SOCK_DGRAM没有想象的那么糟糕, 数据错误只是小概率事件
SOCK_DGRAM 有以下几个特征:
- 强调快速传输而非顺序传输
- 传输的数据可能丢失也可能损毁
- 限制每次传输的数据大小
- 数据的发送和接受是同步的
数据报格式套接字的应用场景:
- 各种实时的聊天软件
- 结合现实的一点自己的理解: 有时候会遇到消息发送失败的情况, 我们重新发送就行了, 虽然用的是不可靠UDP传输, 但是通过应用层应用本身可以保证可靠性, qq服务器收到消息后, 会发送一个udp应答包回传给用户.
面向连接和无连接的套接字到底有什么区别
- 无连接套接字遵循的是「尽最大努力交付」的原则,就是尽力而为,实在做不到了也没办法。无连接套接字提供的没有质量保证的服务。
- 面向连接的套接字在正式通信之前要先确定一条路径,没有特殊情况的话,以后就固定地使用这条路径来传递数据包了。当然,路径被破坏的话,比如某个路由器断电了,那么会重新建立路径。这条路径是由路由器维护的,路径上的所有路由器都要存储该路径的信息(实际上只需要存储上游和下游的两个路由器的位置就行),所以路由器是有开销的。这条预先建立好的路径被称为“虚电路”.
- 面向连接的套接字还包括序号、确认信号、数据偏移、控制标志(通常说的 URG、ACK、PSH、RST、SYN、FIN)、窗口、校验和、紧急指针、选项等信息;而无连接的套接字则只包含长度和校验和信息。
- 有连接的数据包比无连接大很多,这意味着更大的负载和更大的带宽。许多即时聊天软件采用 UDP 协议(无连接套接字),与此有莫大的关系。
再谈TCP/IP模型
TCP/IP四层模型与OSI模型不同, 它考虑了现实情况与商业利益, 是对OSI七层模型的简化.
从上到下分别是应用层、传输层、网络层和链路层(网络接口层),每一层都包含了若干协议。
- TCP/IP 模型包含了 TCP、IP、UDP、Telnet、FTP、SMTP 等上百个互为关联的协议,其中 TCP 和 IP 是最常用的两种底层协议,所以把它们统称为“TCP/IP 协议族”.
- 在茫茫的互联网海洋中,要找到一台计算机非常不容易,有三个要素必须具备,它们分别是 IP 地址、MAC 地址和端口号:
- IP(Internet Protocol Address)地址, 译为”网际协议地址”: 因为IPv4地址并不够用, 每台主机都有ip地址是不现实的, 往往是一个局域网才拥有一个ip地址. 所以只有ip地址并不一定能找到目的主机
- MAC(Media Access Control Address)地址,直译为“媒体访问控制地址”: mac地址也称为硬件地址(能联网的设备都有), 并且它是唯一的, 所以数据到达了一个局域网后, 通过mac地址就能找到具体的目的主机.
- 端口号: 一台计算机可以同时提供多种网络服务, 为了区分不同的网络程序, 计算机会为每个网络程序分配一个独一无二的端口号. 端口(Port)是一个虚拟的、逻辑上的概念。可以将端口理解为一道门,数据通过这道门流入流出,每道门有不同的编号,就是端口号.
总结
第一篇熟悉了tcp/ip模型, 了解了什么是socket套接字, 并清楚的区分两种套接字: 流格式套接字, 数据报格式套接字, 知道了计算机进行通信所需的三要素: IP地址, MAC地址, 端口号.
下一篇就要开始使用高级语言进行操作了