五层网络协议:
0)两个节点物理线路、传输介质是物理层。
1)在数据链路层中传递数据包,并进行校验,DHCP协议是数据链路层的。
【DHCP协议:动态主机配置协议;所有的Internet协议都做了这样一个假设,即主机配置了一些基本信息,比如IP地址。主机是如何获得此信息的?手动配置太麻烦,因此有了DHCP,即自动给主机配置IP地址、网络掩码等信息;由于MAC唯一,租给它一个IP地址】;
2)节点与节点之间可以用数据链路层,但传递给其他学校或国家,这就不是两个节点之间的传输了,就需要网络层。网络层会有路由,包发给路由器,路由器再发给路由器,转转转。通过ip协议,每个节点都有ip地址,最终传到目标节点。网络层还包括ICMP和IGMP协议。ICMP协议是IP协议的附属协议。IP层用它来与其他主机或路由器交换错误的报文和其他重要信息。IGMP是Internet组管理协议。它用来把一个UDP数据报多播到多个主机。网络层还有ARP协议(地址解析协议),作用是将IP地址映射到数据链路层的以太网地址(MAC地址),因为网卡只认识以太网地址(mac地址)。
3)虽然在数据链路层进行了校验,但并不可靠,需要出错重传,就有了传输层。在传输层有了TCP/UDP协议。TCP协议是基于连接的,UDP无连接。
4)数据是为那个应用服务呢?是HTTP还是FTP还是SMTP、POP3、DNS、AMQP,因此需要由应用层。
5)FTP、Telnet、SMTP、HTTP、POP3是基于TCP的;DNS、SNMP、RIP是基于UDP的。
socket只是对TCP/IP协议栈操作的抽象,即socket是TCP/IP协议的API
TCP/UDP的区别:
1)TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2)TCP提供可靠的服务。
3)TCP实时性比UDP的差,UDP更适合于对高速传输和实时性要求较高的通信(比如实时对战网络游戏或广播通信);
4)每一条TCP连接只能是点到点的,即TCP不支持组播或者广播传输模式。UDP支持一对多,多对一,多对多的交互通信。
5)TCP对系统资源要求较多,UDP对系统资源要求较少。
TCP如何保证可靠:
一句话解释
TCP通过校验和、重传控制、序号标识、滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。
详细解释
1、数据被分割为TCP认为最合适的数据块
2、包是按序收到的,即发送顺序和接受顺序一样
3、TCP发送一个段之后会启动一个定时器,等待目标端的确认信息,如果没有收到确认信息,会重发
4、防止序号回绕机制;
5、TCP保证收到的包不出错,即保持首部和数据的校验和,如果收到的校验和出错,TCP将丢弃这个数据包也不会确认这个数据包。
6、TCP会对收到的数据进行重新排序,保证数据以正确的顺序交给应用层。
7、TCP还有流量控制和拥塞控制。
8、滑动窗口协议也是用来保证可靠的。
TCP如何进行拥塞控制:
1、当路由器上的队列增长到很长时,网络层检测到拥塞,并试图通过丢弃数据包来管理拥塞。
2、传输层收到从网络层反馈来的拥塞信息,就会减慢它发送到网络的流量速率。
3、TCP会并发的维持一个拥塞窗口和一个流量控制窗口。拥塞窗口大小限制发送端可以发送的字节数,流量控制窗口指出了接收端可以缓冲的字节数。有效发送是这两个窗口的较小者。
TCP如何进行流量控制:
滑动窗口协议:滑动窗口协议不仅用于流量控制,还参与了一部分拥塞控制。
网络传输为什么不可靠:
丢包、重复包、包出错、包乱序、安全
滑动窗口协议:
是在TCP协议中使用的非常重要的部分,用来维持发送方和接收方缓冲区。这个缓冲区就是为了解决网络传输不可靠的问题。发送方和接收方各自维护自己的缓冲区,商定如何accept传递包和重传机制。
0)窗口大小最大为65535,不仅用于流量控制,还参与了一部分拥塞控制,在传输控制过程中窗口大小是可以调整的,大小为0是合法的。
1)最原始的无滑动窗口协议时:发送一个包,确认一个包。缺点也很明显,很慢;
2)改进方案:两个包一起发,一起确认。缺点也很明显,收到了包1确认,没收到包2确认,那我一直等下去?发不发后面的包?
3)滑动窗口协议:每确认一个包就往后移动:

如果出现丢包,也就是未收到确认信息,那么就有一个超时重传机制。注意接收方发送Ack(确认字符)必须按照顺序来,即使678号包收到了,但5号包一直没收到,就不会发送678号包的Ack信息。只有收到了5号包,才会把5678的Ack一起发送出去。

TCP计时器管理:
1、TCP有三个计时器,分别是持续计时器、保活计时器和重传计时器;最重要的是重传计时器。
2、重传计时器:当TCP实体发出一个段时,它同时启动一个重传计时器,如果在该计时器超时前段被确认,则计时器被停止。如果在确认到来之前计时器超时,则段被重传。
3)那么问题:超时间隔应该设置为多长?解决方案是使用一个动态算法,它根据网络性能的连续测量情况,不断地调整超时间隔。
为什么UDP在越来越多的场景下取代了TCP?
1)UDP以简单、传输快的优势,在越来越多的场景取代了UDP;不能容忍延迟比如LOL、Dota用UDP,可以容忍延迟的游戏如RPG还是用TCP。
2)网速的提升给UDP的稳定性提供可靠的网络保障,丢包率很低,如果使用应用层重传,能够确保传输的可靠性。
3)网络游戏如果采用TCP,一旦发生丢包,TCP会将后续的包缓存起来,等前面的包重传并接收到后再继续发送,延时会越来越大;基于UDP,在对实时性要求较严格的情况下,采用自定义重传机制,能够把丢包产生的延迟降到最低,尽量减少网络问题对游戏性能造成影响。
设计UDP丢包检查来保证可靠性:
1)可以采用一个近似TCP的ack机制,可以给每个数据包都添加一个sequence ID,然后服务端就一次发送数据包,客户端收到数据包后就可以根据sequence id来判断是否有丢包了。
2)客户端需要发该sequence ID的ack给服务端,服务端才会知道这个包是否已经送达。但这是一笔不小的开销,而且,ack本身也有可能丢包。
3)可以这样:客户端发送sequence ID的ack时,附加一个32bit的位序列,表示当前sequence id之前的32个连续顺位的数据包是否已经送达,其实就是冗余的发送连续32个包的送达状态。如果bit为0说明没有到,如果bit为1说明已经收到了。这样一来除非连续丢包30多次,ack是一定会送到的,这种几率已经非常小了。
4)相应的,在服务端设置一个超时机制,这个时间差不多比连续发30个ack的时间长一点,如果发送一个包后开始计时,超时还没有收到ack,这个包就丢失了。
5)但即使丢包了也不一定需要重发,是否需要重发,如何重发可以根据业务的逻辑结合起来,没有必要类似TCP那样完全可靠的机制。
TCP为什么是三次握手、四次挥手?
思想:1网络是不可靠的,任何包都有可能丢 2遇见问题解决问题,不断迭代 3因此网络协议能用就好
三次握手过程:

1、某一端:比如服务器端必须先依次执行LISTEN和ACCEPT原语,然后被动的等待入境连接请求。
2、另一端,比如说客户,执行CONNECT原语,同时说明它希望连接的IP地址,端口等参数。CONNECT原语发送一个SYN标志位为ON和ACK标志位为OFF的TCP段,进入SYN_SENT状态,然后等待服务器响应。
3、当这个TCP段到达接收端时,接收方的TCP实体检查是否有一个进程已经在目标端口上已经执行了LISTEN。如果没有,则它发送一个设置了RST的应答报文,拒绝客户的连接请求。
4、如果是LISTEN,那么TCP实体将入境的TCP段交给该进程处理,进程可以接收或拒绝这个连接请求。如果接受,则进入SYN_RECEIVED状态,并发送回一个确认段。
5、正常情况下:发送的TCP段顺序如下:
(1)第一次握手:客户端发送SYN = x 到服务器
(2)第二次握手:服务器确认后,进入SYN_RECEIVED状态,发送SYN = y, ACK = x +1到客户
(3)第三次握手:客户确认后,进入ESTABLISHED状态,发送SYN=x + 1, ACK = y + 1到服务器,此包发送完毕,服务器收到后进入ESTABLISHED状态。客户端和服务端TCP连接成功,完成三次握手,开始传送数据。如果这里服务器没收到,客户进入ESTABLISHED状态后也会自认为连接完成,开始发送数据,不过发数据一直没有响应,最后会超时断开连接。
(4)客户不知道服务器是否收到它的SYN = x + 1,如此下去是个死循环,因此够用就好
TCP连接如何释放?
0)简称四次挥手
1)虽然TCP连接是全双工的,这里把TCP连接看成是单工的。
2)为了释放一个连接,任何一方(比如A)都可以发送一个设置了FIN标志位的TCP段,这表示它已经没有数据要发送了。当FIN被另一方(如B)确认后,这个方向(A到B)的连接就被关闭。
3)另一方向上或许还继续传着数据流。当两个连接都关闭后,连接才算彻底关闭。
4)为了避免“两军对垒问题”,需要使用计时器,如果两倍最大数据包生成期内,针对FIN的响应没有出现(A发了FIN,A没有收到B的FIN响应),那么FIN发送端(A)会直接释放连接。另一方最终会发现没人监听,超时后也会释放连接。
5)具体如下:

6)注意TIME_WAIT,因为最后接收方不会发送这个ACK回来了,因此发起方会进入TIME_WAIT状态等待一段时间,如果没啥变化,再进入CLOSED状态。
多态: 多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。多态性增强了软件的灵活性和扩展性。
继承: 在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并可以加入若干新的内容,或修改原来的方法使之更适合特殊的需要,这就是继承。继承是子类自动共享父类数据和方法的机制,这是类之间的一种关系,提高了软件的可重用性和可扩展性。
封装: 封装是保证软件部件具有优良的模块性的基础,封装的目标就是要实现软件部件的“高内聚、低耦合”,防止程序相互依赖性而带来的变动影响。在面向对象的编程语言中,对象是封装的最基本单位,面向对象的封装比传统语言的封装更为清晰、更为有力。面向对象的封装就是把描述一个对象的属性和行为的代码封装在一个“模块”中,也就是一个类中,属性用变量定义,行为用方法进行定义,方法可以直接访问同一个对象中的属性。通常情况下,只要记住让变量和访问这个变量的方法放在一起,将一个类中的成员变量全部定义成私有的,只有这个类自己的方法才可以访问到这些成员变量,这就基本上实现对象的封装,就很容易找出要分配到这个类上的方法了,就基本上算是会面向对象的编程了。把握一个原则:把对同一事物进行操作的方法和相关的方法放在同一个类中,把方法和它操作的数据放在同一个类中。
本文深入探讨了网络协议的五层模型,重点讲解了数据链路层的DHCP协议,网络层的IP、ICMP和IGMP,传输层的TCP和UDP。介绍了TCP的可靠传输机制,包括校验、重传、序号标识、滑动窗口、确认应答等。同时,对比了TCP与UDP的区别,如TCP的面向连接、可靠服务和UDP的无连接、实时性。此外,讨论了TCP的拥塞控制和流量控制,以及为何在某些场景下UDP逐渐替代TCP。最后,阐述了TCP的三次握手和四次挥手过程,以及多态和继承的概念。
4312

被折叠的 条评论
为什么被折叠?



