网络是个不少人都知道, 却又是不少人都说不清楚的东西, 对于通常用户来讲, 没什么问题. 但对于一个软件开发人员来讲, 至少要可以大体描述本身的程序中网络部分是如何运做的.git
由于, 目前几乎任何程序都和网络有关, 纯粹的单机程序几乎已经绝迹. 若是弄不清楚网络的运做机制, 除了网络相关问题每每一筹莫展, 而网络问题每每是开发过程当中很难遇到的.浏览器
下面就以一次 HTTP 请求为例, 尽可能简要的说明网路的方方面面.服务器
网络中一些常见的基本概念, 弄清楚以后有助于了解网络的构造.网络
这是最多见的网络设备, 经过网线(无线网除外), 咱们才将一个个网络设备链接在一块儿, 网线承担的责任就是就是把咱们的数据都经过电信号传输到不一样的地方.socket
收到的网络包广播到整个网络.性能
收到的包根据 MAC 地址表转发到指定的端口, 交换机的端口有 MAC 模块, 可是没有 MAC 地址 交换机的 MAC 地址表主要包含 2 个信息:google
交换机的特殊操做:加密
二层交换机 所谓的二层交换机, 其实和通常的交换机在功能上没有什么区别, 就是更高级, 性能更好的交换机而已.设计
路由器是基于 IP 设计的, 路由器中的每一个端口都有 IP 地址和 MAC 地址 经过路由器转发的包, 其中接收方 MAC 地址就是路由器端口的 MAC 地址.视频
如今的路由器其实包含了交换机的功能, 若是只是纯粹的路由器, 包的传输功能实际上是交给交换机来完成的. 路由器设计成只负责 IP 层是有重要意义的, 这样具体的传输就能够委托给其余各类传输技术.
路由器是按照 IP 规则传输包的设备(IP) 集线器是按照以太网规则传输包的设备(MAC) 也就是说, 网络包的传输过程当中, IP 协议头部中的目的 IP 能够不变, 可是 IP 协议头部中 MAC 是不断变化的, 传输过程当中, 中间通过了几回路由器就会变化几回.
接入网就是指链接互联网与家庭, 公司网络的通讯线路.
互联网与家庭, 公司的网路结构基本同样, 不一样点主要有 2 个:
接入网中的术语:
IP 地址由 网络号+主机号 组成
经常使用的 IP 地址有 A, B, C 3 类:
注 主机号全是 0, 表示整个子网, 主机号全是 1, 表示向子网上全部设备发送包, 即 广播
DNS 查询消息由 3 部分组成:
DNS 消息示例: a) 域名: google.com b) Class: IN c) 记录类型: A DNS 会根据这条消息, 返回 goole.com 的 IP 地址
以太网是一种网络类型, 它有 3 个基本特征:
无线局域网也符合以太网的特征, 只是识别包内容不用以太类型, 用的是其余类型
以太网有 全双工 和 半双工 2 种方式:
协议栈主要是 TCP/IP 协议, 其余还有 UDP, ICMP, ARP 等等
服务器和客户端对于 socket 通讯来讲是没有区别的, 惟一的区别在于调用 socket 库的方式上.
客户端 (1). 建立套接字(建立套接字阶段) (2). 用管道链接服务器端的套接字(链接阶段) (3). 收发数据(收发阶段) (4). 断开管道并删除套接字(断开阶段)
服务端 (1). 建立套接字(建立套接字阶段) (2-1). 将套接字设置为等待链接状态(等待链接阶段) (2-2). 接受链接(接受链接阶段) (3). 收发数据(收发阶段) (4). 断开管道并删除套接字(断开阶段)
服务端的套接字, 须要 4 种信息来确认:
有了这 4 种信息, 就能够肯定服务端的套接字, 为何还要套接字描述符来指定套接字呢? 由于: