网络原理
一.应用层:应用层和代码直接相关的一层,决定了数据要传输什么,拿到数据之后如何使用.应用层这里,虽然存在现有的协议(HTTP),但是也有很多情况,需要自己自定制协议.
约定应用层数据报,数据格式,就是在自定义协议
如何约定?
1.确定要传输那些信息(根据需求走)
打个比方:外卖程序,有一个核心功能,加载商家列表~~
请求:
用户id
用户的位置(经纬度)
响应:
若干个商家信息:
每个商家信息:
商家的名字
商家的图片
评分
类型
…
2.确定数据按照啥样的个数来组织(随意约定的)
网络上传输的,本质上都是0101,视为二进制的字符串~~
需要把上述这些信息整程一个字符串~~
比如 :
只要发送方安宅这套个数来组织数据,接收方按照这套格式来解析数据,两者能对的上,这样的格式就是 可行的!!!
实际开发在,有一些现成的格式,可以直接使用的!!!
一种典型的格式,xml 之前非常流行的格式,现在用的比较少,但是也还是经常遇到的。
这种格式是通过标签的形式来组织的
比如:
另外一种非常流行的格式,json
数据的组织方式,有无数种,只不过比较常见的是xml和json
二.传输层(核心)
学习一个协议,其中一个重要的环节,就是认识协议报文格式(具体怎么组织的这个数据)
UDP
UDP报文的格式
一个UDP报文最大长度,就是64kb
使用UDP编程的时候要注意udp数据报不能太长,否则会出问题
2.1校验和
校验和存在的应用就是用来判定一下,当前传输的数据是否出错
如果效验和不对,此时你的数据一定不对.
如果效验和对,但是数据也有一定概率是错误的!!
为了让效验和能够识别率更高一些,计算的时候通常会以数据内容作为参数来进行计算,数据内容发生变化,效验和也会变化
2.TCP
有连接:
可靠传输:TCP存在的初心!!最核心的机制!!
面向字节流:
全双工
2.1TCP如何实现可靠传输??
不是100%可以传过去!!(要求太高了),尽可能的传过去,如果过传不过去,发送方至少能知道自己没传过去
核心机制,在于接收方,收到或者没有收到,会有个应答
确认应答机制:
接收方就可以通过ack的确认序号,告诉发送方哪些数据以及收到了
2.2为啥网络上会出现后发先至??
什么叫做后发先制,打个比方 结婚时的接亲,头车还在路上,后面的车已经到了新郎家里.,叫“后发先制”这个时候就比较乱 往往都是后车到村口了等头车来了在进行整队,然后驶往新郎家,这样一个流程.
对于TCP来说自身也承担了这个整队的任务,TCP会有个接收缓冲区(一块内核中的内存空间),每个socket都有一份自己的缓冲区. TCP就可以按照序号针对收到的消息进行整队了(也是TCP序号的一个重要用途) 后续 应用程序对数据,读到的一定是有序的(和发送顺序一样的)
2.3 丢包也是网络上非常经典的情况
为啥会丢包??
网络上有一系列的交换机 路由器进行转发
如果中间任何一个节点,出现了问题,都可能导致丢包
每个设备,都是在承担很多的转发任务的
每个设备,转发能力都是有上限的!!
某一时刻,某个设备,上面的流量到达峰值,就可能会引起部分数据被丢包(概率性)
2.4超时重传机制(解决丢包问题)
如果包丢了,接收方就收不到了,自然就不会返回ack。
发送方就迟迟拿不到应答报文,等待一段时间后,还是没有收到应答报文,发送方就视为刚才的数据丢包了,就会重发一边
发送方对于丢包的判定,是一定时间内,没有收到ack
1.数据直接丢了,接收方没有收到,自然会不会发ack
2.接收方收到数据了,返回的ack丢了
发送方是区分不了这两种情况,只能都重传
这种情况下数据重复了怎么办??
TCP会给我们自动处理好,会在接收缓冲区根据收到的数据序号,自动去重,保证了应用程序读到的数据仍然只有一份!!!
连续丢包怎么办??
TCP针对多个包丢失,处理思路是,继续超时重传,但是每次丢包一次,超时等待的时间都会变长(重传的频率降低了)TCP绝对重传怕是没戏~干脆就摆烂了
连续多次重传,都无法得到ACK,此时TCP就会尝试重置连接(相当于尝试重连),如果充值连接也失效,TCP就会关闭连接 放弃网络通信了
一切顺利,使用确认应答保证可靠性,出现丢包,使用超时重传作为补充,这两个机制,是TCP可靠性的基石!!
2.5连接管理(TCP最核心的,网络原理最核心的考点)
TCP 建立连接:三次握手
TCP 断开连接:四次挥手
TCP是如何实现可靠性的:确认应答+超时重传
三次握手 :
握手(handshake)指的是通信双方,进行一次网络交互,相当于 客户端 和服务器之间,通过三次交互,建立了连接(双方各自记录对方的信息)关系
上述过程内核自动完成,应用 程序干预不了,等到 连接完成了,服务器accept把建立好的连接从内核拿到应用程序中
Syn称为 同步报文段,意思就是一方要另一方,申请建立连接
双方都确认了关系就建立起来了,连接建立完成!!!
四次交互三次握手
啥样的报文,算是syn报文??
如果一个TCP数据报,第二位和第五位都是1,则当前这个报文是SYN+ACK
为啥要三次握手,起到了什么样的效果,达成了什么目标呢???
三次握手这个过程,本质上是投石问路,验证了客户端和服务器,各自的发送能力和接收能力是否正常!!
这个角度看,三次握手和可靠性,也是有关系的(但是肯定是没有 确认应答和超时重传更重要)
确认了客户端和和服务器 各自的发送能力和接受能力都正常!!这就是后续可靠传输的基石!!!
2.5断开连接,四次挥手(和三次握手非常像)
通信双方,各自给对方发送给一个FIN(结束报文),在各自给对方返回ACK
建立连接,一定是客户端主动发起来
断开连接,客户端和服务器都有可能先发起
Ack和fin有一定概率合并成一个的!!!但是通常情况下,不能合并的!!
2.6 TCP要保证的不仅仅是可靠性,还有效率!!
提高可靠性,往往意味着,损失效率!!
此时A这边花了大量的时间在等带ACK,想提高效率就需要缩短时间,批量发送数据了!!
一次发多条数据,一次等多个ack