这篇博客通过借助TCP/IP五层协议栈分层介绍每一层的作用,重点介绍传输层TCP协议
目录
应用层
自己写的程序就是在应用层,通过自定义应用层协议来确定代码如何·编写,客户端/服务如何交互
如何自定义应用层协议
1.考虑清楚交互过程中要传输的信息
2.考虑信息的组织格式 比如:符号分隔/固定字符长度/XML(标签组织数据)/json (使用{}来包含键值对)
具体使用什么要看需求,当然除了自定义应用层协议还有一些现成的协议最著名的就是HTTP协议,会在后面博客介绍
传输层协议
传输层协议是这篇博客中要详细介绍的很重要,一起来看
UDP 无连接,不可靠传输,面向数据报,全双工
TCP 有连接,可靠传输,面向字节流,全双工
UDP报文
源端口 /目的端口号:发件人电话/收件人电话,使用端口号来区分应用程序
UDP长度:表示UDP报文的长度,注意两个字节最大65535(bit)约等64KB,也就是说UDP数据报文最大就是64KB
校验和:确保数据准确,UDP校验和算法 CRC算法(循环冗余校验和)数据所有字节累加得到结果就是校验和
基于UDP的应用层协议
NFS:网络文件系统
TFTP:简单文件传输协议
DHCP:动态主机配置协议
BOOTP:启动协议
DNS:域名解析协议
TCP协议
我们知道TCP协议的特点就是 有连接,可靠传输,面向字节流,全双工,其中可靠传输就是TCP诞生的初衷,可靠传输就是发件人能知道发送的数据对方收没收到,发件人是可知的
TCP原理
1.确认应答
发送数据后接收方返回一个应答报文
为防止后发先置TCP将发送的数据按字节进行编号,同时应答报文返回确认序列号,告知发送者数据收到,下一个从哪开始发
2.超时重传
当数据传输完返回的应答报文没收到如何解决呢?或者数据发送并未接收如何解决?这就需要引出超时重传机制了
上面的描述我们知道了可能有两种可能触发超时重传
1.业务数据丢失
业务数据丢失超过重传时间,发送方就会重新发送之前的数据直到ACK返回
2.ACK丢失
发送数据后没收到ACK,超过重传时间就会重新发送数据,并且接收方会根据序号来对数据进行去重,保证应用层数据只接收到一份数据,当重传多次之后仍未果就会断开连接,尝试重连,重连失败就会放弃传输
3.连接管理(重要)
在正常情况下,TCP要经过三次握手建立连接,四次挥手断开连接
三次握手
三次握手认为是一种保证可靠性的机制,相当于“投石问路”在正式通信前先确认通信链路是否畅通,验证通信双方发送和接收能力是否正常,同时能够让通信双方协商重要参数
断开连接
TIME_WAIT的等待时间最大为2MSL
4.滑动窗口
滑动窗口是为了在保证可靠性的前提下提高效率的机制
发送一批数据等待一批ACK,同时发送数据个数N,N就是窗口大小,每次收到ACK后窗口都会向后移动(继续发以后的数据)
滑动窗口是否影响安全呢?要看超时重传(数据丢失/ACK丢失)
1.ACK丢失,在收到之后数据的ACK就会认为之前的数据已经收到了
2.数据丢失,没收到数据无法返回对应的ACK,在收到后面数据时也会继续返回没收到数据之前的ACK,提醒重传数据并且会记下后面的数据(快重传)
5.流量控制
窗口越大,发送速率越快,流量控制是对于发送速率进行制约,让发送速率与接收速率相当
流量控制是通过接收缓冲区剩余空间的大小作为下次窗口的大小(ACK报文返回)
ACK报文中有16位窗口大小字段,并且在选项字段中有“窗口扩大因子”
当接收缓冲区满了时,窗口大小为0则返回ACK为01后发送会停止,过会会发送“探测包”,来探测窗口大小,方便以后数据的发送
6.拥塞控制
虽然有了流量窗口这个能提高效率的方法,但是开始就大量发生数据或者在网络环境拥堵的条件下仍然大量的发送数据无疑是雪上加霜
我们可以通过B的剩余缓冲区计算窗口大小但是如何计算中间节点的处理能力呢?拥塞控制通过做实验的方式来找到合适的窗口(动态平衡)
初始从小数开始(慢开始)之后指数增长到初始阈值后线性增加,到达网络拥塞之后回归到小窗口并且修改阈值(达到拥塞时窗口的一半为新阈值)
流量控制(接收缓冲区返回ACK)和拥塞控制(中间设备自己实验)都会影响窗口大小,两者取小值来决定窗口大小
7.延时应答
延时应答是提高效率的机制让窗口能更大一些
在延时的过程中,应用程序消耗接收缓冲区可能使窗口变大提高了效率,延时时间一般为200ms或者每隔两个包在应答
8.捎带应答
基于延时应答的策略
ACK是内核行为,响应是应用程序代码确认发送的,通过延时应答+捎带应答一起发送从而提高效率
9.面向字节流
面向字节流指的是读写载荷数据的时候,是按照“字节流”的方式来读取的,TCP数据报本身还是一个一个的“数据报”来传输的
面向字节流最核心的问题:粘包问题
在TCP中传输多个应用层数据报,这时就容易分不清从哪到哪是一个完整的数据报
解决方法 1.使用分隔符 2.约定长度
10.TCP连接异常处理
1.主程序关机:杀进程->释放PCB->释放文件资源->FIN(四挥)->结束关机
2.程序崩溃:杀进程->释放PCB->释放文件资源->FIN(四挥)->结束关机
3.主机掉电:1)接收方掉电,发送数据,没有ACK,尝试重传,多次无果,尝试重连直到放弃
2)发送方掉电,接收方在一定时间没收到数据就会定期给发送方发“心跳包”
4.网线断开:与主机掉电同理
好的以上就是网络原理中有关应用层和传输层(主要TCP)的知识总结,希望对你有帮助,还请点赞 评论 蟹蟹!!!会持续更新的