前言 作为一名程序员, 不可能不与网络打交道. 现在我们的手机, 电脑, 不夸张地说, 离开了网络就是一块'废铁', 它们的作用将大打折扣.. 本文的作用呢, 主要是针对不是非网络专业开发的人员准备的, 以'最短的时间, 了解计网最多的知识'为前提起笔.
概述先来了解下各种我们知道, 但是不太了解的专业名词的意思 因特网因特网 因特网是当今世界上最大的网络, 是'网络的网络'. 即因特网是所有网络互连起来的一个巨型网络. 因特网的组成 :
以太网以太网是现在最常用的局域网通信协议, 以太网上传输的是MAC帧. 由于以太网同一时间只允许一台计算机发送数据, 所以必须有一套检测机制, 那就是CSMA/CD协议 :
OSI开放系统互连基本参考模型, 只要遵守这个OSI标准, 任何两个系统都能进行通信. OSI是七层协议体系结构, 而TCP/IP是一个四层协议体系结构, 于是我们采取折中的方法, 学习计算机网络原理的时候往往用的是五层协议的体系结构 : 物理层, 数据链路层, 网络层, 传输层和应用层 协议体系结构 物理层计算机的世界里只有0和1, 正如你现在所看这篇文章的文字, 存储在计算机中也是一大串0和1的组合. 但是这些数字不能在真实的物理介质中传输的, 而需要把它转换为光信号或者电信号, 所以这一层负责将这些比特流(0101)与光电信号进行转换. 如果没有物理层, 那么也就不存在互联网, 不存在数据的共享, 因为数据无法在网络中流动. 数据链路层数据在这一层不再是以比特流的形式传输, 而是分割成一个一个的帧再进行传输. MAC地址又称计算机的硬件地址, 被固化在适配器(网卡)ROM上的占48位的地址. MAC地址可以用来唯一区别一台计算机, 因为它在全球是独一无二的 分组交换由于数据在这次曾要被分割成一个一个的帧, 由于不同的链路规定了不同的最大帧长, 即MTU(最大传输单元), 凡是超出这个MTU的帧都必须被分块. 例如一台货车一次能运输5吨的货物, 而有条公路限载重2吨, 那么你只好分3次运输. 网桥网桥工作在数据链路层, 根据MAC帧的目的地址对收到的帧进行转发和过滤. 以太网交换机实际上就是一个多接口的网桥, 以太网交换机的每个接口都直接与一个单个主机或另一个集线器相连, 可以很容易实现VLAN(虚拟局域网) 以太网的MAC帧MAC帧的格式为 : MAC帧格式
网络层如果只有数据链路层没有网络层, 数据就只能在同一条链路上传输, 不能跨链路传输. 有了网络层, 数据便能跨域不同的数据链路传输. IP地址IP地址又称为软件地址, 存储在计算机的存储器上, IPv4地址为32位, IPv6地址为128位 IP地址和MAC地址
IP地址分类IP地址 = {<网络号>, <主机号>} A类地址 : 0.0.0.0 ~ 127.0.0.0 划分子网之后的IP地址IP地址 = {<网络号>, <子网号>, <主机号>} 例如某单位拥有一个B类IP地址, 145.13.0.0, 但凡目的地址为145.13.x.x的数据报都会被送到这个网络上的路由器R. 内部划分子网后变成
: 子网掩码一般由一串1和一串0组成, 不管网络有没有划分子网, 将子网掩码和IP地址做按位与运算即可得出网络地址. 所有的网络都必须使用子网掩码, 同时在路由表中必须有子网掩码这一栏. 如果一个网络不划分子网,
那么该网络的子网掩码就是默认的子网掩码. 尽管划分子网增加了灵活性, 但是却减少了能够连接在网络上的主机总数. 构成超网的IP地址IP地址 = {<网络前缀>, <主机号>} 使用网络前缀, 无分类域间路由选择CIDR 例如, 128.14.35.7/20, 意思是前20位为网络前缀, 后12位为主机号. 另外, CIDR把网络前缀相同的连续的IP地址组成一个'CIDR地址块' 地址掩码 : CIDR使用32位的地址掩码, 类似于子网掩码. IP数据报在网络层, 数据是以IP数据报(IP分组)的形式传输的 IP数据报的格式 首部前20字节为固定长度, 是所有IP数据报必备的. 后4字节是可选字段, 其长度可变. IP数据报首部固定的字段分析 :
IP层转发分组的流程每个路由器内部都维护一个路由表, 路由表包含以下内容( 使用子网时分组转发时, 路由表必须包含以下三项内容: 特定主机路由 : 对特定的目的地址指明一个路由 默认路由 : 不知道分组该发给哪个路由器时就发给默认路由. 当一个网络只有很少的对外连接时使用默认路由非常合适. 路由器的分组转发算法
虚拟专用网VPN因特网中的所有路由器对该目的地址是专用地址的数据报一律不转发, 下面有3种专用地址(虚拟IP地址)
假设现在公司A有一个部门在广州和另一个在上海, 而他们在当地都有自己的专用网. 那么怎么将这两个专用网连接起来呢?
网络地址转换NAT多个专用网内部的主机公用一个NAT路由器的IP地址, 在主机发送和接收IP数据报时必须先通过NAT路由器进行网络地址转换. NAT路由器的工作原理 不仅如此, NAT还能使用端口号, 摇身一变成为网络地址和端口转换NAPT ARP协议ARP是解决同一个局域网上的主机或路由器的IP地址和MAC地址的映射问题, 即 IP地址 -> ARP -> MAC地址 每一个主机都有一个ARP高速缓存, 里面有本局域网上的各主机和路由器的IP地址到MAC地址的映射表. 以下是ARP的工作原理 : ARP的工作原理.jpg 那如果是跨网络使用ARP呢?
传输层这一层是重中之重, 因为数据链路层, 网络层这两层的数据传输都是不可靠的, 尽最大能力交付的. 什么意思的? 就是它们不负责提交给你的就是正确的数据. 然而这一层的TCP协议将要提供可靠传输 这一层主要重点是两个协议 : UDP 和 TCP 用户数据报协议UDPUDP主要特点 :
UDP首部UDP首部格式
传输控制协议TCPTCP主要特点 :
TCP的工作流程TCP字节流 TCP的连接TCP连接的端点叫套接字(socket)
每一条TCP连接唯一地被通信两端的两个端点(socket)所确定. 即 : TCP报文段的首部TCP报文段的首部
窗口TCP中很重要的一个概念, 那就是窗口(发送窗口和接收窗口) 窗口 由于停止等待协议非常低效, 于是衍生出窗口这一概念. 上图为发送方维持的发送窗口, 位于发送窗口的5个分组都可以连续发送出去而不需要等待对方的确认. 每收到一个确认, 就把发送窗口前移一个分组的位置. 这大大提高了信道利用率! 接收方不必发送每个分组的确认报文, 而是采用累积确认的方式. 也就是说, 对按序到达的最后一个分组发送确认报文. 超时重传如果发送方等待一段时间后, 还是没收到 ACK 确认报文, 就会启动超时重传. 这个等待的时间为重传超时时间(RTO, Retransmission TimeOut). 然而, RTO 的值不是固定的, 这个时间总是略大于连接往返时间(RTT,Round Trip Time). 假设报文发送过去需要5秒, 对方收到后发送确认报文回来也需要5秒, 那么RTT就为10秒, 那这RTO就要比10秒要略大一些. 那么超过RTO之后还没有收到确认报文就认为报文丢失了, 就要重传. 流量控制利用滑动窗口和报文段的发送时机来进行流量控制. 拥塞控制发送方维持一个拥塞窗口cwnd, 发送窗口 = 拥塞窗口.
- 当cwnd < ssthresh, 使用慢开始算法
- 当cwnd > ssthresh, 使用拥塞避免算法
- 当cwnd = ssthresh, 随意 拥塞控制 只要判断网络出现拥塞, 把ssthresh设为当前发送拥塞窗口的一半(不能小于2), 并把cwnd设为1, 重新执行慢开始算法. 除了慢开始和拥塞避免算法外, 还有一组快重传和快恢复算法 :
TCP三次握手TCP三次握手建立连接和四次挥手断开连接是面试爱问的知识点. TCP三次握手
更加接地气的解释就是 : A打电话给B 第一次握手 : 你好, 我是A, 你能听到我说话吗
第二次握手 : 听到了, 我是B, 你能听到我说话吗
第三次握手 : 听到了, 我们可以开始聊天了
三次握手其实就是为了检测双方的发送和接收能力是否正常, 你说呢? TCP四次挥手TCP四次挥手
更加接地气的解释 : 第一次挥手 : A告诉B, 我没数据发了, 准备关闭连接了, 你要发送数据吗
第二次挥手 : B发送最后的数据
第三次挥手 : B告诉A, 我也要关闭连接了
第四次挥手 : A告诉B你可以关闭了, 我这边也关闭了 应用层应用层协议最著名的就是HTTP, FTP了, 还有一个重要的DNS 域名系统(DNS, Domain Name System)DNS 能将域名(例如, www.jianshu.com)解析成IP地址. 域名服务器分类
DNS查询DNS查询
DNS查询例子 : 域名为x.tom.com的主机想知道y.jerry.com的IP地址
URLURL的格式 : 使用HTTP协议的URL : HTTP协议HTTP是面向事务的, 即它传输的数据是一个整体, 要么全部收到, 要么全部收不到. 万维网的工作过程 每一次HTTP请求就需要建立一次TCP连接和释放TCP连接. HTTP是无连接, 无状态的. 每一次请求都是作为一次新请求. HTTP/1.0 缺点 : 无连接, 每一次请求都要重新建立TCP连接, 所以每一次HTTP请求都要花费2倍RTT时间(一次TCP请求, 一次HTTP请求) HTTP/1.1 : 使用持续连接, 即保持TCP连接一段时间. HTTP/1.1持续工作的两种工作方式 : 非流水线方式和流水线方式
非流水线方式 : 收到一个请求的响应再发下一个请求, 效率低, 浪费资源
流水线方式 : 能够同时发送多个请求, 效率高 HTTP的GET和POSTGET 请求通常用于查询、获取数据,而 POST 请求则用于发送数据 ps : POST请求的数据也是以明文的形式存放在请求头中, 因此也不安全 Cookie万维网使用Cookie来跟踪用户, 表示HTTP服务器和用户之间传递的状态信息. Cookie工作原理 : 1. 用户浏览某网站, 该网站的服务器为用户产生一个唯一的识别码, 并以此为索引在服务器后端数据库中产生一个项目
2. 返回给用户的HTTP响应报文中添加一条 'Set-cookie', 值为该识别码, 如123
3. 用户的浏览器将该cookie保存起来, 在用于继续浏览该网站时发送的每一个HTTP请求都会有一行 Cookie: 123
于是, 这个网站就知道Cookie为123的这个用户做了什么, 为这个用户维护一个独立的列表(如购物车) 当然, Cookie是把双刃剑, 方便的同时也带有危险性, 例如隐私泄露等, 用户可以自行决定是否使用Cookie SessionCookie是保存在客户端上的, 而Session是保存在服务器中. 当服务器收到用户发出的Cookie时, 会根据Cookie中的SessionID来查找对应的Session, 如没有则会生成一个新的SessionID返回给用户 总而言之, Cookie和Session就是同一样东西存放地方不同而已. HTTPSHTTPS协议 HTTPS协议在HTTP协议的基础上, 在HTTP和TCP中间加入了一层SSL/TLS加密层, 解决了HTTP不安全的问题: 冒充, 篡改, 窃听三大风险. 对HTTPS是如何做到安全, 加密等有兴趣的可以参考以下文章 《SSL/TLS协议运行机制的概述》 作者:Jerry4me 授权转载 |
|