目录
面向字节流
粘包问题
在面向字节流的情况下,会产生一些其他的问题:粘包问题,这里“粘”的是“应用层数据报”,通过TCP read/write的数据,都是TCP报文的载荷,也就是应用层数据。
发送方一次性是可以发送多个应用层数据报的,但是接受的时候,如何区分,从哪里到哪里是一个完整的应用层数据报?如果没设计好,接收方就很难区分,甚至产生bug!
那么如何避免粘包问题呢?归根结底就是一句话,明确两个包之间的边界。
此处正确的做法,是合理地设计应用层协议,这件事本身在传输层这边已经无解了,需要站在应用层的角度,来解决这个问题
1.应用层协议中,引入分隔符,区分包之间的边界。
比如\n
2.应用层协议中,引入"包长度”,也能区分包之闻的边界。
比如使用最开头固定的2个字节表示包的长度,0x0003aaa
TCP异常情况
网络本身就会存在一些变数,导致TCP连接不能继续正常工作了。以下是出现那些情况时TCP如何处理使其正常
- 进程崩溃
进程就没了=>PCB没了=>文件描述符表也就被释放了=>相当于调用了socket.close()
,socket在系统内核也是一个文件,也会被放到文件描述符表中=>崩溃的一方就会发出FIN,进一步触发四次挥手,此时连接就正常释放了。此时TCP的处理和进程正常退出没啥区别
- 主机关机(正常步骤的关机)
正常关机,就会先尝试干掉所有的进程(强制终止进程),就和上述所说的崩溃的处理是一样的。主机关机会有一定的时间,在这个时间内四次挥手可能是挥完的,如果没挥完也没事
- 主机掉电(拔电源,没有任何反应的机会)
电脑瞬间黑了,此时自然就没有任何可以操作的空间了。
- 网线断开
相当于主机掉电的升级版。
以上 TCP 介绍的十个核心的特性
- 确认应答(可靠性)
- 超时重传(可靠性)
- 连接管理(可靠性)
- 滑动窗口(效率)
- 流量控制(可靠性)
- 拥塞控制(可靠性)
- 延时应答(效率)
- 捎带应答(效率)
- 面向字节流 => 粘包问题(编程注意事项目)
- 异常情况处理 => 心跳包(异常情况)
TCP/UDP对比
我们说了TCP是可靠连接,那么是不是TCP一定就优于UDP呢?TCP和UDP之间的优点和缺点,不能简单,绝对的进行比较
网络层重点协议
在复杂的网络环境中确定一个合适的路径。
IP协议
协议头格式如下:
IP地址
网络上有那么多主机,需要有办法描述主机的具体位置。IP地址就是解决这个问题的关键。
IP地址概念
IP地址(Internet Protocol Address)是指互联网协议地址,又译为网际协议地址。
IP地址作用
IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。
IP地址格式
IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节),如:01100100.00000100.00000101.00000110。
通常用“点分十进制”的方式来表示,即 a.b.c.d 的形式(a,b,c,d都是0~255之间的十进制整数)。如:100.4.5.6。
所谓的IP地址其实是一个32位的整数(4字节),表示方式:点分十进制。因为32位的方式表示很难记忆。点分十进制:使用三个.把32位分成4部分,每个部分就是8位,1字节,每个字节范围0-255(不带符号)
IP地址不够用了怎么办?[重点]
- 动态分配IP(DHCP)
你这个设备,不会一直需要上网,需要上网,就分配ip,不需要就先不分配。
这种方案,只能缓解,不能根治
- NAT机制(网络地址转换)(理解网络结构的重点)
只需要保证在我所在的局域网内不重复即可,在别的局域网也可以使用这样的IP地址。此时,大量的设备可以使用同样的IP了(但是是在不同局域网中),此时 IP 不够用问题就得到了很大的改善了
但还是想了别的办法。把IP地址分成两大类:
- 内网IP:不同的局域网内的设备,内网 IP 可以重复;同一个局域网内的设备,内网 IP 不能重复
- 外网IP:外网IP不能重复
局域网之间如何通信?
- 如果局域网内部的设备之间进行通信,肯定是可以的(局域网内部 内网 ip 都是唯一的)
- A局域网中的设备,想和 B 局域网中的设备通信,这个时候咋办?(当前很可能这俩设备的 ip 相同)
- 局域网内部的设备访问带有外网 IP 的设备
这个过程中,就涉及到 NAT 工作过程了
NAT机制的缺点:
- 效率不高
- 非常繁琐
- 不方便直接访问局域网内的设备
NAT最大的优点:纯软件实现(省钱)
- IPv6(从根本上解决IP地址不够用的问题)
IPv4,是 4 个字节,32位,表示 IP 地址
IPv6,是 16 个字节,128 位,表示IP 地址
但由于IPv4和IPv6不兼容,要想升级IPv6就要升级路由器设备=>花钱
相比之下,NAT方案只需要路由器开发商开发出新版本的软件(路由器固件),升级软件,即可直接支持(成本非常低的)
IP地址的组成
IP地址分为两个部分,网络号和主机号
网络号:标识网段,保证相互连接的两个网段具有不同的标识;
主机号:标识主机,同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号;
通过合理设置网络号和主机号,就可以保证在相互连接的网络中,每台主机的IP地址都是唯一的。
- 同一个局域网中设备的 网络号 必须相同,主机号 必须不同
- 两个相邻的局域网,网络号必须不同
那么,如何划分网络号和主机号呢?
- 通过子网掩码识别
子网掩码和 IP 地址一样,也是 4 字节,32 位的整数。左侧必须是连续的 1,右侧必须是连续的 0
- 分类
过去曾经提出一种划分网络号和主机号的方案,把所有IP 地址分为五类