持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情
- 英文小册原文地址:beej.us/guide/bgnet…
- 作者:Beej
- 中文翻译地址:www.chanmufeng.com/posts/netwo…
现将目录贴下:
- 什么是socket
- IP地址、struct以及地址转换
- IP地址,IPv4和IPv6
- 字节序
- struct结构
- 再谈IP地址
- 从IPv4迁移到IPv6
- IP地址,IPv4和IPv6
- 字节序
- struct结构
- 再谈IP地址
- System call 或 Bust
- getaddrinfo()—准备开始!
- socket()—拿到文件描述符!
- bind()—我在监听哪个端口?
- connect()—嘿,你好啊!
- listen()—会有人联系我吗?
- accept()—感谢呼叫3490端口
- send() and recv()—跟我唠唠吧,宝儿!
- sendto() and recvfrom()—用DGRAM风格跟我说话
- close() and shutdown()—滚犊子!
- getpeername()—你哪位?
- gethostname()—我是谁?
- Client-Server基础
- 一个简单的流服务器
- 一个简单的流客户端
- Datagram Sockets
- 技术进阶
- Blocking—何谓阻塞?
- poll()—同步的I/O多路复用
- select()—老古董的同步I/O多路复用
- 数据只传了一部分怎么办?
- Serialization-如何封装数据?
- 数据封装
- 广播数据包-大声说「Hello,World」
学习计算机怎么能不谈网络分层呢。下面我们就简单了解一下网络是怎样工作的,并且举一些如何SOCK_DGRAM 封包的例子。
实际上,如果你可以跳过这一节内容,不过,这一节能帮你很好的了解网络背景,有一定的参考意义。
现在是时候了解一下*Data Encapsulation*(数据封装)了,它实在实在是非常重要!即便如此,在大部分的网络课程的学习中,所占的笔墨并不算多。
一般情况下,我们会这么讲:
你发送的数据构成了最初始的数据包,然后将数据包封装到应用层协议(比如TFTP协议)的header中,然后将封装之后的包再次封装到下一个协议(UDP)中,再接着被封装到下一个协议(IP协议),最终被硬件层面的通讯协议(以太网协议)封装。
接收方接收到数据后,硬件层会拆掉以太网header和footer,操作系统内核会拆开 IP 与UDP header,最后由应用层程序TFTP 解开TFTP header,最终获取到用户数据。
接下来终于可以聊一聊声名狼藉的网络分层模型(Layered Network Model),也就是 "ISO/OSI"了。
说它声名狼藉,是因为所有入门计算机网络的人首先学习的便是这个分层模型,而对刚接触网络的小白而言很难对分层有很深的理解和感悟,只能是死记硬背,最终的结果就是应付考试而已。
20世界70年代后期,国际标准化组织(ISO)提出计算机网络应该组织为大概7层,并称之为开放系统互连(OSI)模型。事实上,OSI模型的创建者提出这个模型的时候并没有联想到如今使用的因特网,但并不妨碍OSI模型到如今依然适用,这便是抽象的能力。
OSI模型将网络分层为:
- 应用层
- 表示层
- 会话层
- 传输层
- 网络层
- 链路层
- 物理层
但是这种分层实在是过于繁琐,因此现在介绍网络分层,一般都是拿TCP/IP协议栈来进行说明。
- 应用层(比如
telnet、ftp等) - 传输层(
TCP、UDP等) - 网络层(
IP、ICMP以及IGMP) - 网络接口层(
以太网、wi-fi等)
每一层分别负责不同的通信功能:
- 应用层负责处理特定应用程序的细节。比如对用户消息的加密解密操作、按照特定格式对数据进行组装或解析等。
- 传输层主要为两台主机上的应用程序提供端到端的通信。所谓的端到端,就是能找到真正处理数据包的两个进程。举个例子就是快递能够保证送货上门,而不只是送到小区驿站。
- 网络层,用于主机之间的路由,就是只负责找到对应的主机。
- 网络接口层,有时候也被称为数据链路层或链路层,通常包括操作系统中的设备驱动程序和计算机的网卡设备,它们一起处理与物理传输媒介的通信细节。