计算机网络模型
OSI采用了分层的结构化技术,共分七层, 物理层、数据链路层、网络层、传输层、会话层、表示层、应用层 。
OSI模型比较复杂且学术化,所以我们实际使用的TCP/IP模型,共分4层, 链路层、网络层、传输层、应用层 。
两个模型之间的对应关系如图所示:
各协议的解释
- TCP:传输控制协议(TCP)是一种面向连接的协议,它在发送数据之前先建立一个连接。TCP确保数据在网络上正确地传输,确保数据的可靠性和完整性,它还能够控制数据的流量和拥塞。TCP是应用广泛的协议之一,用于电子邮件、网页浏览和文件传输等应用中。
- UDP:用户数据报协议(UDP)是一种无连接的协议,它不需要在发送数据之前建立连接。UDP不保证数据的可靠性或完整性,但它更快速、更简单,适用于对数据传输延迟较为敏感的应用程序。UDP常用于音视频传输、在线游戏等实时性较高的应用中。
总的来说,TCP适用于那些需要确保数据可靠性和完整性的应用,而UDP适用于那些需要快速数据传输和实时性的应用。
- IP:Internet Protocol (IP)是一种协议,用于在计算机网络上传输数据包。它是一种无连接协议,意味着在发送数据之前不会建立连接。IP协议负责数据的传输和路由,以确保数据正确地从源主机传输到目标主机。
- ICMP:Internet控制消息协议(ICMP)是一种协议,用于在IP网络上传输控制消息。它通常用于诊断网络问题,如测试主机是否可达、测量网络延迟和带宽等。
- RIP:路由信息协议(RIP)是一种用于动态路由的协议。它通过广播路由信息来使网络中的路由器了解网络拓扑结构,并计算出最佳路由。RIP通常用于小型网络。
- OSPF:开放最短路径优先(OSPF)是一种基于链路状态的路由协议,用于大型企业网络中的动态路由。它使用Dijkstra算法来计算最短路径,并通过交换链路状态信息来建立拓扑图。
- BGP:边界网关协议(BGP)是一种用于互联网中的路由协议。它是一种路径向量协议,用于在AS之间选择最佳路径。BGP的主要作用是确保互联网上的路由器能够相互通信,并在网络出现问题时快速恢复。
- IGMP:Internet组管理协议(IGMP)是一种协议,用于在多播网络中管理组成员。它允许主机加入或离开多播组,并在网络中通知路由器有多少主机加入或离开多播组。
- SLIP:串行线路互联协议(SLIP)是一种早期的协议,用于在串行线路上传输IP数据包。它已被PPP所取代,因为SLIP具有固定的IP地址、缺乏安全性和完整性检查等问题。
- CSLIP:压缩串行线路互联协议(CSLIP)是一种改进的SLIP协议,它使用压缩技术减少了IP数据包在串行线路上的传输负载,提高了传输速度。
- PPP:点对点协议(PPP)是一种面向连接的协议,用于在两个计算机之间传输数据。它支持多种协议,如IP、IPX、NetBIOS等,并提供身份验证、加密和压缩等功能。
- ARP:地址解析协议(ARP)是一种协议,用于将IP地址映射到MAC地址。ARP通过广播消息来查找目标MAC地址,并在ARP缓存中保存映射关系,以提高网络效率。
- RARP:反向地址解析协议(RARP)是一种协议,用于将MAC地址映射到IP地址。RARP通过广播消息来查找目标IP地址,并在RARP服务器中保存映射关系,以提供动态IP地址分配。
- MTU:最大传输单元(MTU)是指在一个网络通信链路上最大允许的数据包大小。MTU取决于链路类型,如以太网、无线网络等,通常是固定的。如果数据包的大小超过MTU,则需要进行分片和重新组装。
总的来说,SLIP和CSLIP已经过时,PPP是常用的点对点协议,ARP和RARP用于地址映射,MTU则决定了一个网络通信链路上最大允许的数据包大小。
- ISO 2110:这可能是指ISO 2110标准,它定义了一种通用的网络协议体系结构。该标准定义了七层协议栈(物理层、数据链路层、网络层、传输层、会话层、表示层和应用层),每层都有特定的功能和协议。
- IEEE 802:这是一个系列的协议,由IEEE(电气和电子工程师协会)定义。该系列包括多个标准,如IEEE 802.3(以太网)、IEEE 802.11(Wi-Fi)和IEEE 802.15(蓝牙)等。每个标准定义了特定类型的网络,包括局域网、无线局域网和个人区域网络等。
- IEEE 802.2:这是IEEE 802系列中的一个子协议,也称为逻辑链路控制(LLC)协议。该协议定义了一种标准化的数据链路层协议,为高层协议提供了一个统一的接口。它在IEEE 802网络中广泛使用,包括以太网、令牌环网和无线局域网等。
总的来说,ISO 2110定义了一种通用的协议体系结构,IEEE 802系列定义了各种类型的网络标准,IEEE 802.2是IEEE 802系列中的一个子协议,为高层协议提供了一个统一的接口。
说一下TCP三次握手,为什么需要三次,不是四次或两次?
TCP 提供面向有连接的通信传输。面向有连接是指在数据通信开始之前先做好两端之间的准备工作。
所谓三次握手是指建立一个 TCP 连接时需要客户端和服务器端总共发送三个包以确认连接的建立。在socket编程中,这一过程由客户端执行connect来触发。
为什么TCP握手需要三次?
TCP是可靠的传输控制协议,而三次握手是保证数据可靠传输又能提高传输效率的最小次数。
为了实现可靠数据传输, TCP协议的通信双方,都必须维护一个序列号, 以标识发送出去的数据包中,哪些是已经被对方收到的。
举例说明:发送方在发送数据包(假设大小为 10 byte)时, 同时送上一个序号( 假设为 500),那么接收方收到这个数据包以后, 就可以回复一个确认号(510 = 500 + 10) 告诉发送方 “我已经收到了你的数据包, 你可以发送下一个数据包, 序号从 511 开始” 。
三次握手的过程即是通信双方相互告知序列号起始值,并确认对方已经收到了序列号起始值的必经步骤。
如果只是两次握手, 至多只有连接发起方的起始序列号能被确认, 另一方选择的序列号则得不到确认。
至于为什么不是四次,很明显,三次握手后,通信的双方都已经知道了对方序列号起始值,也确认了对方知道自己序列号起始值,第四次握手已经毫无必要了。
TCP的三次握手的漏洞-SYN洪泛攻击
但是在TCP三次握手中是有一个缺陷的,就是如果我们利用三次握手的缺陷进行攻击。这个攻击就是SYN洪泛攻击。三次握手中有一个第二次握手,服务端向客户端应答请求,应答请求是需要客户端IP的,攻击者就伪造这个IP,往服务器端狂发送第一次握手的内容,当然第一次握手中的客户端IP地址是伪造的,从而服务端忙于进行第二次握手但是第二次握手当然没有结果,所以导致服务器端被拖累,死机。
面对这种攻击,有以下的解决方案,最好的方案是防火墙。
无效连接监视释放
这种方法不停监视所有的连接,包括三次握手的,还有握手一次的,反正是所有的,当达到一定(与)阈值时拆除这些连接,从而释放系统资源。这种方法对于所有的连接一视同仁,不管是正常的还是攻击的,所以这种方式不推荐。
延缓TCB分配方法
一般的做完第一次握手之后,服务器就需要为该请求分配一个TCB(连接控制资源),通常这个资源需要200多个字节。延迟TCB的分配,当正常连接建立起来后再分配TCB则可以有效地减轻服务器资源的消耗。
使用防火墙
防火墙在确认了连接的有效性后,才向内部的服务器(Listener)发起SYN请求。
说一说TCP四次挥手,为什么是四次?
四次挥手即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发。
由于TCP连接是全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当甲方完成数据发送任务后,发送一个FIN给乙方来终止这一方向的连接,乙方收到一个FIN只是意味着不会再收到甲方数据了,但是乙方依然可以给甲方发送数据,直到这乙方也发送了FIN给甲方。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭。
为什么TCP的挥手需要四次?
TCP是全双工的连接,必须两端同时关闭连接,连接才算真正关闭。
如果一方已经准备关闭写,但是它还可以读另一方发送的数据。发送给FIN结束报文给对方,对方收到后,回复ACK报文。当这方也已经写完了准备关闭,发送FIN报文,对方回复ACK。两端都关闭,TCP连接正常关闭。