Java 网络原理(二)--- TCP的机制 + IP协议 +以太网协议 + DNS
文章目录
- TCP的机制
- 捎带应答
- 面向字节流
- 异常情况的处理
- TCP和UDP的对比
- 网络层
- IP协议
- 报头
- 地址管理
- 网段划分
- 路由选择
- 数据链路层
- 以太网协议
- 以太网数据帧
- DNS
TCP的机制
捎带应答
- 在延时应答的基础上才有机会合并,进一步地提高效率
- 捎带应答:指的是在返回 response 的同时,顺便把 ack 给带上返回给发送方
面向字节流
- 这里有一个重要的问题,粘(nian)包问题(不是 TCP 独有的,而是所有面向字节流的机制都有类似的情况)
- 此处的 包 指的是 应用层数据包,如果同时有多个应用层数据包被传输过去,此时就容易出现粘包问题。
- 什么是粘包问题?
就是从 A 到 B(B中有接收缓冲区),把数据发送到接收缓冲区中,这些数据就会紧挨在一起,要读的时候是按字节来读,那么就可以按1个字节读,2个字节读,3个字节读这样的问题
4. 相比之下,UDP这样面向数据报的通信方式,就没有上述的问题
5. 如何解决粘包问题?
核心思路:通过定义好应用层协议,明确应用层数据包之间的边界
确认边界:
1.引入分隔符
2.引入长度
xml:边界是结束标签
json:边界是{}
protobuffer:边界是长度
异常情况的处理
如果在使用 tcp 的过程中,出现意外,怎么进行处理?
(1) 进程崩溃:
(2) 主机关机(正常流程关机):
1指的是进程崩溃
(3) 主机掉电(非正常):
(4) 网线断开:
TCP可以单方面释放连接:
- )心跳机制(非常重要):工作中经常要在代码中自己写,我们写的心跳机制要达到很短的时间来检测,某个机器是否挂了
TCP和UDP的对比
- TCP 优势 可靠传输(TCP 适用于大部分场景)
- UDP 优势 更高效率 (UDP 更适合于,对于 可靠性不敏感,性能敏感 的场景)
可靠性不敏感,性能敏感的场景:
3. 如果要传输比较大的数据包,TCP 更优先(UDP 只有64KB的限制)
4. 如果要进行 广播传输,优先考虑 UDP。UDP 天然支持广播,TCP不支持(要在应用程序中额外写代码实现)
UDP的广播传输:
TCP的广播传输:如果是投屏功能的实现的话,需要 TCP 遍历每个设备的ip地址和主机号,都尝试去连接,对比 UDP 会比较慢和效率低,并且更加复杂
- 经典面试题:如何基于UDP 实现可靠传输?
这个问题本质上是考察 TCP !!!
网络层
- 应用层和传输层都是日常开发中密切相关的,网络层涉及的是ip地址,和路由器之类的开发相关
- 网络层要做的事,主要有两个方面:
(1) 地址管理:制定一系列的规则,通过地址,描述出网络上一个设备的位置
(2) 路由选择:网络环境比较复杂,从一个节点到另一个节点之间,存在很多条不同的路径,就需要通过这种方式,筛选/规划出更合适的路径进行数据传输
IP 协议是网络层中的协议
IP协议
报头
- 4位版本和4位首部长度(和TCP一样):
- 8位服务类型(TOS):能够让 IP 协议,切换形态
(3 位优先权字段(已经弃用),4位TOS字段,和 1 位保留字段(必须置为0))
这四个位,彼此之间是冲突的。只有一位设为1。不同的位设为1,表示 IP 协议是不同的形态。
四种形态:最小延时,最大吞吐量,最高可靠性,最小成本
最小延时:一方给另一方传输数据时,消耗的总体时间最短
最大吞吐量:单位时间内传输的数量最多
最高可靠性:最不容易出现丢包的情况
最小成本:系统开销是最小的
这些形态对于开发影响是比较小的,没有立竿见影的效果
- 16位总长度(字节数):描述了 IP 数据包最长是多长
IP协议,确实存在 64KB 这样的限制,但是 IP 协议自身支持 拆包组包 的功能可以扩大这里的容量
通过三个属性,来支持 IP 协议的拆包和组包:16位标识,3位标志,13位片偏移
16位标识(把包拆成多个小的,16位标识可以用来区分这些小包是不是同一组的)
13位片偏移(给每个小包进行排序)
3位标志(有一个保留位是没用的)
4. 8位生存时间(TTL),单位是次数
如果把 TTL 设置成 32,会不会不够用?
会不会明明数据包是合法的目的ip,还没有到达 ttl 就耗尽了
这个情况也是有可能会存在的,概率不大。因为有其他的大的TTL可以使用,比如64,128…
一般来说,TTL都是比较充裕的
怎么理解这个比较充裕呢?
就是在网络中每个路由器,要找一个别的路由器,每个路由器都发动这些相邻的路由器去寻找(就是我的朋友去找我朋友的朋友),有个理论就是六度空间是有关于这个寻找到目的ip的例子:
5. 8位协议:描述的是,IP数据包的载荷部分,是一个 UDP 数据包还是 TCP 的数据包(判断传输层是哪个协议)
- 16位首部检验和:只效验首部,因为它的载荷是其他协议的报头,它们可以自己校验
- 32位源IP地址和32位目的IP地址:
地址管理
- IP地址,是一个32位的整数 2^32 = 42亿9千万,这么多的地址也是不够用的,地址是不能够重复的,但是如何解决 IP 地址不够用的问题呢?
- NAT 机制把IP地址分为两个大类:
(1) 内网IP(局域网IP)
(2) 外网IP(广域网IP)
- NAT机制是怎么工作的?
替换IP:我的电脑有一个内网IP,经过运营商的路由器,将我的ip替换为了外网IP,然后再经过广域网,最终到达 ip138 的服务器,最终我会发出数据
反向替换IP(源ip和目的ip会交换):外网上的IP到达运营商路由器,(之前保存了映射关系),把原来自己的内网IP给替换回来了,最终我会收到数据
如果当前局域网内,有多台主机,都访问同一个网站的服务器,此时服务器返回的响应经过当前的路由器之后,要交还给哪个主机呢?
通过端口号来区分是不同的主机
那如果端口号也相同呢?该怎么办?
这样的话,路由器就会对相同的端口号进行处理,把它们替换成不同的端口号来进行区分
解决 IP地址 不够用的问题:
4. 解决IP地址不够用的终极方案(最优解):IPv6
因为NAT机制和动态分配的方式都是提高ip地址利用率的
IPv6 是2^128个ip,是一个非常大的数,根本用不完,大幅度提高了ip地址的个数,从根本上解决了问题,但是事实上IPv6普及程度比较低,因为从IPv4升级到IPv6是没有网速提升的,因此没有什么人来升级。但是中国是超过70%的都升级了IPv6了,这和国际贸易战有关。
一般来说,需要手动开启IPv6
网段划分
-
把一个 IP地址,会分成两个部分
网络号(标识了一个局域网) + 主机号(标识了局域网中的一个设备)
以上的内容了解即可,最多也是以 笔试题/选择题 的形式出现 -
192.168.1.10,一个 IP地址,哪个部分是网络号,哪个部分是主机号,是不一定的。子网掩码,就是用来确定网络号的,对应是1的那么IPv4地址中的就是网络号
上古时期的网络划分:
-
几种特殊的IP
1.主机号全0和主机号全1
2.环回IP(自己发给自己),可以再测试中使用,可以保证网络一定是通畅的
路由选择
- 路由选择就是描述了 IP协议(IP数据报)转发过程的
路由器转发数据报的过程是比较复杂的,我们通过一个简单的例子,来了解一下这个过程:
- 一个网络层的数据报,每次到达一个路由器,也会进行上述的 问路 过程,每个路由器内部都一个数据结构 路由表 ,根据数据报中的 目的IP,查路由表,如果查到了(问的人,恰好知道怎么走),就直接按照路由表给定的方向(从哪个网络接口进行转发),继续转发就行了。如果没查到(问的人,不知道怎么走),路由表里有一个 默认的表项(下一跳地址),按照默认的表项转发即可
路由表的数据结构,这里的内容是怎么来的?
1.可以手动配置(网管可以根据需要手动配置)
2.自动获取(背后还有一系列的路由表生成算法,有点复杂)
这个路由表的数据结构,面试不考,工作中也不太会用到(除非你是做路由器开发的)
IP协议和TCP协议的复杂程度是一样的,只是我们程序员很少涉及到IP协议
数据链路层
- 这里也有很多协议,但是比较常见的是 以太网协议
以太网协议
- 以太网协议:通过网线/光纤来通信,使用的协议,以太网,横跨数据链路层 + 物理层
2. 以太网协议是有线的,wifi,移动流量(4 G,5G)是无线的,就不太一样
以太网数据帧
-
格式:
CRC是帧尾,并且是校验和 -
目的地址和源地址:都是6个字节的,不是IP地址了!!!是网络中的另一套地址体系,mac地址(物理地址),它的定位和 IP地址,有一定的冲突/重合的
为什么搞出mac地址,功能上和IP地址重合呢?
3. mac地址的范围:2^32 * 2 ^16(65535),比ip地址能表示的范围大多了,现在mac地址还可以作为每个设备的唯一标识
4. mac地址的格式(有线网卡和无线网卡):
5. IP地址和mac地址各自的用途是什么呢?
IP地址立足于全局,完成整个通信过程的路径规划工作
以太网则是关注于局部,相邻两个设备之间的通信过程
传输层关注的是起点和终点,
网络层关注的是路径的规划
数据链路层关注的是相邻节点之间的转发,mac在不同节点之间转发每次都会发生变化
- 类型:描述载荷数据是一个什么样的数据,有三种类型的载荷数据(了解即可)
DNS
- DNS:应用层协议 & 一套系统,域名解析系统
什么是域名?
IP地址,是用来描述设备在网络上的位置的,一个网站的宣传,IP地址不适合于宣传,它是一个32位的整数,就算用点分十进制来表示了,也不容易读懂。这样就引入了 域名 这样的方式来解决上述问题
域名:单词(表示实际的意义)
比如:www.baidu.com
www.sogou.com
这些域名需要有一套自动的系统,把域名翻译成IP地址(域名和 IP 想象成一组键值对)
大部分的域名都是很便宜的
-
这个域名系统是怎么进行工作的呢?
最早的域名解析系统,是通过一个简单的文件来实现的
hosts 文件:键值对的映射关系
-
全世界,无时无刻都有很多的设备需要进行DNS的请求,这一组DNS服务器,能抗得住这么高的请求量吗??
原始的DNS服务器是根,其他的镜像服务器是赋值原始的DNS服务器的 -
一个典型的场景,一般进行DNS解析,访问的都是就近的运营商的镜像
那么如果运营商的镜像服务器,是否会出现问题呢?(非常地常见)
会出现问题的,比如qq能用,网页打不开(是彻底地打不开) -
DNS具体是如何查询的。几级域名概念,这里就不多介绍了。