目录
Cookie和Session之间的理解
传输层TCP/UDP:
UDP协议
UDP校验和(检验和)
基于UDP的应用层协议
TCP最核心机制
三次握手建立连接,四次挥手断开连接
四.滑动窗口(提高传输效率)
五.流量控制
六.拥塞控制
七.延时应答(提高传输效率)
八.捎带应答(提高传输效率)
九.面向字节流
粘包问题
十.异常情况
TCP最终目标
网络层
特殊的IP:
Cookie只是浏览器存储数据的 一种方式(客户端概念)
Session是服务器进行描述用户身份信息的方式(服务器端概念)
实现Session机制的过程中(程序员手动实现),通常要把Session id放在cookie中保存。
应用层 HTTP/HTTP/HTTPS/FTP/SSH 应用程序相关
传输层 UDP/TCP
网络层 IP 操作系统内核
数据链路层 以太网
物理层 以太网 硬件和驱动程序负责
传输层关注的是 点对点 之间的传输
只需要关注者和接受者就可以了,中间的传输过程一概不管
UDP 与TCP都是全双工
全双工:通信允许数据在两个方向上同时传输,它在能力上相当于两个单工通信方式的结合。可以同时进行信号的双向传输。指A-->B的同时B-->A)。是瞬时同步的。
1.无连接
2.不可靠
3.面向数据报
1.有连接
2.可靠传输 (发送者能感知到失败)
3.面向字节流
UDP协议格式
端口号传输层的概念,作用就是区分这个数据要交给那个程序来处理
HTTP默认端口号为80
UDP的报文长度:最多16位(64k),这是一个较小的数字
这就限制了应用层协议的数据长度,一旦数据长度超出了UDP的表示范围,就会出现问题
可以在应用层通过代码把应用数据拆分成多个数据报,在使用多个UDP数据报来分别发送
代码实现的成本大大提高了
比较简短,同时最好能和内容相关联
UDP中使用的是CRC循环冗余校验的方式
uint16_t checksum = 0
for(一次遍历数据包的每个字节){
checksum += 当前字节的值
}
发送者在发送之前先计算了一个校验和checksum1就把数据和checksum1 一起发送到对端。
接收端也按照相同的规则计算校验和checksum2.
对比checksum1与checksum2是否相同
NFS: 网络文件系统
TFTP: 简单文件传输协议
DHCP: 动态主机配置协议
BOOTP: 启动协议(用于无盘设备启动)
DNS: 域名解析协议
1.可靠传输
2.尽量提高传输效率
TCP的相关机制有很多,都是围绕上述两点展开的
一.确认应答(可靠性的核心机制)
对于序号来说,按照每个字节的方式来编号的
确认序号来说,表示当前序号之前的数据已经正确收到
接下来对端应该给我发送确认序号开始的数据
二.超时重传(可靠性的核心机制)和确认应答相辅相成
如果对方没有确认应答,此时隔一定时间之后,就需要重复
传输这样的数据,重传是为了进一步的降低丢包的可能性
重传的间隔时间采取的是一种比较悲观的态度,等待时间越来越长
如果达到一定的次数之后对方还没有响应,就断开和对方通信的连接。
如果是是应答数据包丢失(ACK),同样会超时重传,此时就导致接收方收到了两份相同的数据。TCP会根据序号来自动去重
三.连接管路
建立连接的意义:(也是可靠性的一部分)
1.双方先试探下对方是否适合和我进行通信
2.双方可以协商一些重要的数据 序号从几号开始
双方各自向对方发送
三次握手中涉及到的状态变化:
1.LISTEN状态(服务器)
2.ESTABLISHED状态(客户端/服务器):
四次挥手的过程:
双方各自向对方发送FIN,再各自向对方发送ACK
中间的两次交换,可能合并成一个
四次挥手的状态转换:
1.CLOSE_WAIT:收到第一个FIN的一方进入LIOSE_WAIT,是为了等待代码中调用 关闭 方法
如果你发现服务器上出现大量的CLOSE_WAIT状态,意味着什么?意味着代码有bug,忘记调用close方法了
2.TIME_WAIT:主动断开连接的一方进入TIME_WAIT状态,存在的意义是为了一旦最后一个ACK丢包,还有机会进行重传
TIME_WAIT会存在一定的时间,在超出这个时间之后,TIME_WAIT状态才会真正消失,释放对应的连接
窗口的含义是:不等待ACK的情况下最多发多少数据
滑动的含义:每次收到ACK数据的同时,就继续往后发下一组数据
如果窗口越大,传输效率越高
窗口也不能无限大,如果窗口太大可能会影响到可靠性
滑动窗口中如果丢包,采用快速重传的方式来进行重传
快速重传本质上就是超时重传,只不过,重传的时候没有拖泥带水,只重传了真正丢包的数据
窗口越大,传输效率越高,但是窗口也不能无限大。如果窗口太大,可能接收端,处理不过来
如果生产速度超过了消费速度,接收缓冲区的内容就会越积越多,达到一定程度缓冲区满了,此时在传输的数据就会丢包
使用接受缓冲区空间大小,用这个指标衡量接收端的处理能力
通过这个指标来控制发送端的窗口大小(发送速度)
接受端的缓冲区空余空间大小,作为TCP协议报头中的窗口大小,这个值就是发送端的滑动窗口大小的一个“建议值”
滑动窗口的窗口大小不能无限大,即使接收端处理速度很快,也可能因为网络环境不佳导致数据丢包。
最终的滑动窗口大小是由 流量控制 和 拥塞控制 共同决定的。
拥塞窗口:拥塞控制机制所建议的窗口大小,从一个比较小的数字开始,如果网络畅通,放大窗口大小,如果网络丢包,缩小窗口大小
滑动窗口的最终值就是 流量控制 的窗口和 拥塞控制 窗口的较小值
慢开始:刚开始传输的时候拥塞窗口设置的小一些。
在可靠性的基础上,尽量提高窗口大小。
也是和滑动窗口以及流量控制相关
流量控制中需要在ACK中反馈接受接受缓冲区剩余空间的大小。此时采用的策略是,收到数据不立刻返回ACK,而是等一会。等的过程中,程序就能消费一些缓冲区中的数据,从而导致反馈的窗口大小就要更大一些。
建立在延时应答的基础上的
内核反馈ACK的实际和程序反馈响应的时机合二为一。通过同一个数据报同时带上两方面的信息。
结束报文段
ACK是由内核控制
FIN是由用户代码控制的,执行到socket对象的关闭方法的时候,才会发送FIN
由于面向字节流读取数据方式没有具体的约定,很难从接收缓存区中直接获取到一个完整的应用层数据报
解决粘包问题只能从应用层角度入手
只要在应用层协议设定的时候,明确包的边界就可以了
1.指定分隔符
2.指定包的长度
1.程序异常结束(没有影响,四次挥手正常完成)
2.系统关机
3.主机掉电/拔网线
a)掉电的是接收方,发送方会触发超时重传,尝试重新建立连接,彻底释放连接
b)掉电的是发送方,接收方如果一直收不到数据的话,达到一定时间之后,就会给对方发送一个“心跳包”,如果没有心跳了,就会重新尝试建立连接,如果连接建立失败,彻底释放连接。
1.可靠性(主) 确认应答/超时重传/连接管理
2.传输效率(次)滑动窗口/快速重传
1.流量控制
延时应答
2.拥塞控制
粘包问题不是TCP的问题
粘包问题不是TCP自身的问题,是面向字节流导致的一个问题,和应用层的代码直接相关
IP协议(物流公司)
1.地址管理
通过一个整数来表示一个地址,IP地址
IPV4一个IP地址是一个32位的整数
IP地址不够用的问题
a)动态分配IP 某个主机上网,就分配IP,不上网,就不分配
b)NAT机制,很多主机共用同一个IP地址路由器(NAT设备根据端口号来进一步区分数据交给那个主机)
c)IPV6彻底解决问题
使用点分十进制来表示ip地址
192.168.1.100
网段划分:IP地址的前半部分划分成网络号,后半部分划分成主机号
网段划分是为了组建不同的局域网,路由器来链接不同的局域网。同一个局域网中的若干设备,网络号相同,但是主机号不相同
两个相同的局域网,网络号一定不相同
/24表示子网掩码
子网掩码也是一个32位的整数,前半部分都是1后半部分都是0
子网掩码按位与上IP地址,就得到了网络号
将IP地址中的主机地址全部设为0,就成了网络号,代表这个局域网;
将IP地址中的主机地址全部设为1,就是广播地址,用于给同一个链路中相互连接的所有主机发送数据包;
127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1;(表自己)
IPV6
2.路由选择
相当于地图软件的导航功能
数据链路层
更贴近底层
数据链路层更关注两个相邻节点之间如何传输数据
ARP协议:IP地址 --->MAC地址之间的转换
MTU:一个数据链路层的数据帧所搭载的数据最大长度
以太网的MTU1500字节
对于IP协议的影响:会导致IP数据报产生分包