计算机网络基础回顾
对于程序员来说,计算机网络的知识是很重要也很基础的。尤其是做web开发就要对http或者https很熟。有的时候涉及到域名,还会碰到跨域问题。这些其实都是计算机网络相关的知识,本篇就主要回顾下计算机网络中的重要内容:
- 1 IP地址
- 2 分层结构
- 3 网络层
- 4 传输层
- 5 应用层
IP地址
IP地址是一台机器在局域网或者公网上唯一的标识,比如最常见的我们检测本机的网络好不好使需要ping 127.0.0.1
;在局域网的时候,需要设置局域网的地址,比如192.168.0.2
;上网的时候,还需要配置猫...种种的操作都与IP地址有关系。
IP地址分类
IP地址的结构是这样的:0-255.0-255.0-255.0-255,但是并不是每一个ip都能随便给别人用的,IP地址大致分为五类:
类型 |
网络位与主机位 |
IP范围 |
---|---|---|
A类 |
前8位为网络位 0开头 |
1.0.0.0/8-126.0.0.0/8 |
B类 |
前16位为网络位 10开头 |
128.0.0.0/16-191.0.0.0/16 |
C类 |
前24位为网络位 110开头 |
192.168.0.0/24-223.0.0.0/24 |
D类 |
不区分网络位和主机位 1110开头 |
224.0.0.0-232.0.0.0 |
E类 |
不区分网络位和主机位 11110开头 |
233.0.0.0-255.0.0.0 |
这里的网络位和主机位就涉及到子网掩码的作用了....一般公司或者我们自己上网的IP都是C类的。这个C类的地址只是一个出口,内部会形成一个局域网,内部的IP就随便分类啦...只要最后数据包能从这个口发出去就行啦。
note: 127.0.0.0/8作为环回地址测试使用
回环地址
127.0.0.1是回环地址,这个应该是众所周知的。那么它到底有什么作用呢?搜索了一下知乎的答案,可以这么理解:
127.0.0.1是专门给本机用的,叫做lookback,即回环,它是一块虚拟的网卡。如果本机的两个软件进行通信,就可以直接使用127.0.0.1,这样可以避免再走一次协议栈(物理层、数据链路层、ip层),节省了大量的时间。这个地址一般配置再电脑的hosts文件里面,当然你也可以改...改完大量的软件都可能不好使了...localhost默认就是指向的这个ip地址。
分层结构
计算机网络的体系结构有几种版本,最常见的就是OSI的七层网络模型:
物理层-->数据链路层-->网络层-->运输层-->会话层-->表示层-->应用层
另外还有TCP/IP的五层结构:
物理层-->数据链路层-->网络层-->运输层-->应用层
一般TCP/IP的五层体系结构说的比较多点,就简单的描述下他们每层的作用:
- 物理层:这一层涉及到信号的传输,比如双绞线呀、光纤啊等等
- 数据链路层:这一层具体的传输数据类,不过是按照Mac物理地址传输的。主要涉及的问题有数据帧的封装、传输和差错检测。有个很有名的机制——CSMA/CD载波监听多点接入/碰撞检测,用来处理传输的时候传输冲突的。
- 网络层:这一层涉及到IP到MAC的解析等,涉及到的协议有ARP、RARP、ICMP、IGMP等
- 运输层:这个是计算机网络中最重要的一层,因为它里面有两个协议——TCP和UDP,最重要的就是他们的区别,以及TCP的三次握手、四次握手机制,以及一些拥塞控制的方法
- 应用层:这一层的内容是与开发最接近的一层,比如DNS、FTP、HTTP、SMTP等等。
数据链路层
这一层主要负责数据帧的封装、传输和差错检测。
网络层
IP数据报
这一层是对数据报的基础封装,主要是针对分片和IP相关的内容:
协议
另外,这一层主要是几个网络协议很重要,其中包括:
ARP地址解析协议
ARP,Address Resolution Protocol 地址解析协议,是根据IP地址获取对应的物理地址。大致的流程是:
比如A主机访问B主机,对应的ip分别为ipa,ipb;对应的Mac地址为maca,macb
那么:
- A主机现在自己机器上的路由表,查找ipb对应的macb
- 如果找不到则广播请求,如果收到对应的应答,则记录到路由表中
这个APR的缓存一般都是在网卡中记录的。
RARP逆地址解析协议
RARP,Reverse Address Resolution Protocol 用于不知道自己IP只知道Mac地址而想要与其他主机通信的场景。原理过程与ARP差不多。
ICMP网际控制报文协议
ICMP,Internet Control Message Protocol 控制报文协议。这个协议其实日常使用非常多,比如ping和traceroute,它主要用于主机和路由之间传递控制消息。比如网络痛不痛、主机达不达、路由是否可用等等。
IGMP网际组管理协议
IGMP,Internet Group Management Protocol 组管理协议,在组播的场景下比较有用。平时接触的比较少...
单播、多播和广播
- 单播就是固定的两个ip之间的通信,比如访问网页、看看新闻等等;
- 多播一般用于局域网内的视频会议等等,可以节省流量。另外现在很火的直播技术,其实用的也是单播,而非组播。因为组播目前公网没有开放,应该是运营商利益问题或者是安全角度考虑吧
- 广播一般也是在局域网内,比如某个具有探测功能的集群,一般会采用这种方法。
V**
V**的全称是Virtual Private Network,是在公网上建立的专用网络,通过复杂的加密手段,可以实现目标地址的远程访问。比如一般的公司,都会开启V**,这样你放假在家有事情也可以直接连公司的V**,就像在公司一样进行办公。
常用的端口号
传输层
UDP
UDP, User Datagram Protocol 中文是用户数据报协议。是一种不需要进行连接的传输层协议,提供简单不可靠的服务,没有什么拥塞控制,这种传输协议主要就是用于音频视频的实时传输,丢包无所谓的场景。比如看足球直播,画面花一点或者停顿一下,都是无所谓的,只要后续的传输能正常继续就可以了。使用它的协议包括:TFTP、SNMP、NFS、DNS、BOOTP
特点: 无连接、尽最大努力交付、面向报文;并且没有拥塞控制、支持多种对接方式、首部开销小。
小故事: 据说很多有年代的即时通讯比如QQ底层是基于UDP为主的,主要的原因就是TCP在0几年那个网络环境很差的时代,开销太大。一旦网络发生拥塞,TCP的重传或者三次握手,都会有很大的压力。因此就采用UDP,基于应用层进行重传、乱序等机制的封装。参考资料:QQ为什么以UDP为主TCP为辅
TCP
TCP,Transmission Control Protocol 传输控制协议,它是一种面向连接、可靠的、基于字节流的传输通信协议。在可靠性方面,TCP通过超时重传以及确认机制进行传输;在流量控制方面,采用滑动窗口协议,进行窗口内的分组确认以及重传。
关于流量控制,有个很经典的机制就是——慢开始和拥塞避免,之前在做分布式日志采集的时候,想要引入这种机制来着,后来不了了之了。
TCP的连接采用三次握手机制
三次握手说起来很简单,就是A想和B建立连接,那么需要经过三个步骤:
- A发起连接请求
- B确认并且发起连接请求
- A确认B的连接请求
TCP的释放采用四次握手机制
因为TCP是全双工的通信方式,即两个方向都可以传输数据。因此在释放的时候需要双向进行释放。如果只释放了单向,那么另一个方向也是可以传输数据的。步骤大致如下:
- A发起关闭请求
- B确认
- B发起关闭请求
- A确认
状态机
参考
- BZOJ4753: [Jsoi2016]最佳团体
- 3101: N皇后
- 算法模板——线性欧拉函数
- jdbc基础 (一) MySQL的简单使用
- 小白博客 爆破内网mysql数据库root密码脚本代码
- 2818: Gcd
- 1688: [Usaco2005 Open]Disease Manangement 疾病管理
- 通过MySQL自动同步刷新Redis
- 13.MySQL(一) 数据库简介mysql安装数据库操作Mysql数据类型存储引擎
- 3314: [Usaco2013 Nov]Crowded Cows
- BZOJ4766: 文艺计算姬
- 14.MySQL(二) 数据之表操作表内容操作Mysql 连接事务外键
- 3450: Tyvj1952 Easy
- SP104 HIGH - Highways
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 深入Node.js的模块加载机制,手写require函数
- Redux异步解决方案之Redux-Thunk原理及源码解析
- MySQL设计与优化
- Elasticsearch学习笔记
- 《springboot实战》
- 360全国大学生信安技术大赛记录
- gh0st源码分析与远控的编写(四)
- 记一次Elasticsearch优化总结
- unix环境高级编程(上)-文件篇
- php webshell下直接反弹shell(不借助任何其他语言)
- XssHtml – 基于白名单的富文本XSS过滤类
- unix环境高级编程(下)-高级IO和进程间通信篇
- mybatis原理,配置介绍及源码分析
- web.py使用不当可能造成代码执行
- 《redis设计与实现》1-数据结构与对象篇