如何优化TCP 协议,来达到好的效果
左面主机想和右面主机进行通讯
在应用层:进程主体,申请端口,创建套接字(一个四元组),两端的套接字和套接字进程通讯。
在运输层:端到端:防火墙
在网络层:主机和主机之间的(IP 和 IP 之间)
运输层协议概述:
TCP :传输控制协议,面向连接,可靠的数据传输协议。
UDP :用户报协议,无连接,不可靠的数据传输协议。
交付和差错检验是TCP / UDP 最低责任。
基本责任,将两个运行在端上的进程之间负责通信。
UDP 为什么要进行差错检验?
对于可靠还是不可靠,讲的是,包到的顺序,有没有丢包,UDP 并不管理丢包。
不过一个包经过一系列过程中,到达对端,还是要进行差错检验的。
差错检验:奇偶校验。。。
有问题的数据丢掉,没有问题的数据交付。
有差错的包是否可以恢复?只要加的校验码足够多,就可以。
所谓的连接,并不是真的有一个线,将两个对象连在一起,而且两端上各自有一个数据,来存储对方的数据,知道对方的变化。
对于UDP ,不需要知道对方的状态。发送的时候不知道对方是否还在线,如果对方不在线的话,UDP 依然会发送数据,这就给网络带来了一定的压力,所以使用UDP 的时候,需要在应用层,做一个封装。所以对于网络来说,UDP 是不友好的。
多路复用,多路分解:
当一个地址收到很多消息,到了之后,需要分发信息(多路分解)。
每个端口发送的信息,都经过这一个地址(多路复用)。
多路复用和多路分解
在运输层,只关注端口。
在网络层,只关注从哪里来的,到哪里去。
一个网站服务端,两个客户。
客户A, 发送一个报文,四元组
客户C,发送两个报文,开了两个客户端,在C 中也有一个26145 的端口,但是对于服务端来说,这还是3个客户,虽然房间号一致,但是楼号不一致。
为什么会选择无连接的运输服务 UDP
- 关于何时、发送什么数据的应用层控制更为精细(使用TCP ,发送数据,不受自己控制,即使自己发送太快,TCP 也会根据自己流量控制,拥塞控制,发送数据。UDP, 没有这个限制)
- 无需建立连接(代价小,效率高)
- 无状态连接(负担小)
- 分组开销小(每一个包的真实信息承载量更大)
SNMP 简单网络管理协议
所有网络提供商,管理光猫。
在网络不太顺畅的时候,TCP 会限制发送,使用UDP 就像是一个法外狂徒,可以全力使用网速,虽然可能会对网络造成更大的阻塞(TCP 更加抑制),这个时候,需要管理网络,限制发送端的流量,尽可能限制UDP 发送,虽然也限制了TCP。
在网络中发生了网络风暴(形成死循环的情况,可能是路由表出现问题,或者是DNS 层面发生问题,导致信息一直在内部循环,数据会越来越多,导致TCP 连接无法建立),这个时候管理网络,只能使用UDP,发送很多的包,有一个到达一个路由器,就会组织风暴的发生。
UDP 采用的是循环冗余校验。
UDP 校验和
先对所有的相加,看最后一组,发生了溢出,溢出的1与原本相加得到的后两位01 相加,得到了10,每次相加都这样循环,最终得到校验码。
如何构建一个可靠的连接。
方法1 : 使用一个可靠的信道。(运输层传输为可靠,TCP)
当使用一个不可靠的信道,我们需要做哪些事情,让不可靠的信道,变得可靠。
在写一个大型应用的时候,我们应该需要考虑,我们需要使用什么。
RDT 1.0: 完全可靠的信道
发送方:拥有完全可靠的信道,创建一个数据包,使用UDP 发送包就可以
接收方:可靠的接收信息,解析包,上传数据即可。
RDT 2.0 : 具有比特差错信道。传递的信息不会丢失。