参考:https://blog.csdn.net/xuedan1992/article/details/80958522
? ? ? ? ? ?https://blog.csdn.net/freeking101/article/details/77977941
? ? ? ? ? ?https://blog.csdn.net/zhouchuan152/article/details/103124394
1、OSI(Open System Interconnect),即开放式系统互联。 一般都叫OSI参考模型,是ISO(国际标准化组织)组织在1985年研究的网络互联模型。
2、TCP/IP参考模型是计算机网络的祖父ARPANET和其后继的因特网使用的参考模型。ARPANET是由美国国防部DoD(U.S.Department of Defense)赞助的研究网络。
3、ISO制定的OSI参考模型的过于庞大、复杂招致了许多批评。与此对照,由技术人员自己开发的TCP/IP协议栈获得了更为广泛的应用。
一、OSI七层和TCP/IP四层对比
OSI七层模型 | 功能 | TCP/IP四层模型 | 对应网络协议 | 应用层(Application) | 人机交互(文件传输,电子邮件) | 应用层 | FTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet ... | 表示层(Presentation) | 数据格式修改、压缩、加密、转化 | 无 | 会话层(Session) | 建立会话连接 | 无 | 传输层(Transport) | 端对端传输、可靠传输 | 传输层 | TCP,UDP | 网络层(Network) | 路由,寻找最佳路径 | 网络层 | IP, ICMP,ARP, RARP, AKP, UUCP | 数据链路层(Data Link) | 建立链路转发、MAC寻址及错误检测功能 | 数据链路层 | FDDI,Ethernet,PDN,SLIP,PPP | 物理层(Physical) | 二进制传输(脉冲信号)于物理接口 | IEEE 802.1A,IEEE 802.2 到 IEEE 802.11 |
不难看出,TCP/IP 与 OSI 在分层模块上稍有区别。OSI 参考模型注重“通信协议必要的功能是什么”,而 TCP/IP 则更强调“在计算机上实现协议应该开发哪种程序”。?
OSI七层协议模式图
更具体详解参考:科来网络通信协议图2020版
二、OSI七层和TCP/IP四层的关系
1、OSI引进了服务、接口、协议、分层的概念,TCP/IP借鉴了OSI的这些概念建立TCP/IP模型。 2、OSI先有模型,后有协议,先有标准,后进行实践;而TCP/IP则相反,先有协议和应用,再提出了模型,且是参照OSI模型。 3、OSI是一种理论下的模型,而TCP/IP已经被广泛应用,称为网络互联实施上的标准。
三、TCP/UDP基础
1. TCP
- TCP 与 UDP 的区别相当大。它充分地实现了数据传输时各种控制功能,可以进行丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。而这些在 UDP 中都没有。
- 此外,TCP 作为一种面向有连接的协议,只有在确认通信对端存在时才会发送数据,从而可以控制通信流量的浪费。
- 根据 TCP 的这些机制,在 IP 这种无连接的网络上也能够实现高可靠性的通信( 主要通过检验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现)。
2. UDP
- UDP 不提供复杂的控制机制,利用 IP 提供面向无连接的通信服务。
- 并且它是将应用程序发来的数据在收到的那一刻,立即按照原样尽可能快的发送到网络上的一种机制。即使是出现网络拥堵的情况,UDP 也无法进行流量控制等避免网络拥塞行为。
- 此外,传输途中出现丢包,UDP 也不负责重发。
- 甚至当包的到达顺序出现乱序时也没有纠正的功能。
- 如果需要以上的细节控制,不得不交由采用 UDP 的应用程序去处理。
- UDP 常用于一下几个方面:1.包总量较少的通信(DNS、SNMP等);2.视频、音频等多媒体通信(即时通信);3.限定于 LAN 等特定网络中的应用通信;4.广播通信(广播、多播)。
3.TCP的三次握手
C? ? ? ? ? ? ? ? ——?>? SYN=1? seq=X? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? S
C? ? ? ? ?SYN=1,ACK=1? ?ack=X+1,seq=Y <——? ? ? ?S? ? ? ? ? ? ? ? ? ? ? ?半开队列 ? 计时器? ?(此处可进行半开攻击)
C? ? ? ? ? ? ? ? ?——>? ACK=1? ack=Y+1? ? ? ? ? ? ? ? ? ? ? ? ??? S? ? ? ? ? ? ? ? ? ? ? ?全连队列 ?? ?
?服务器(Server)在收到客户端(Client)的SYN信息并回包时会将这个链接放在一个半开队列中,并且会设置一个计时器,如果说客户端在计时器的倒计时结束之前回送了第三行的ACK,则服务器就会把链接放在一个全连队列里。(可以说握手有没有成功就看链接动作有没有被放在全连队列里)
3.1 三次握手
- 第一次握手:客户端将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给服务器端,客户端进入发送(SYN-sent)状态,等待服务器端确认,同时服务器端打开监听(LISTEN)状态。(在此之前客户端和服务器同时属于Closed状态,表示没有连接关系)
- 第二次握手:服务器端收到数据包后由标志位SYN=1知道客户端请求建立连接,服务器端将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给客户端以确认连接请求,服务器端进入回复(SYN-rcvd)状态。
- 第三次握手:客户端收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给服务器端,服务器端检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,客户端和服务器端进入稳定链接(ESTAB-lished)状态,完成三次握手,随后客户端与服务器端之间可以开始传输数据了。
3.2 为什么要进行三次握手?
- 双向确认,为了保证服务端能收接受到客户端的信息并能做出正确的应答而进行前两次(第一次和第二次)握手,为了保证客户端能够接收到服务端的信息并能做出正确的应答而进行后两次(第二次和第三次)握手。
三次握手解释图示
?图示详细信息参考https://blog.csdn.net/weixin_48684274/article/details/108263608
3.3 半开攻击
- SYN半开攻击:(一个伪造的客户端)在计时器没有走完之前重复发送大量初始连接请求(SYN)而不回确认ACK,导致半开队列被占满,服务器无法提供正常合法连接服务(拒绝服务状态)?。
- 防御:SYN_Cookie 技术,记录SYN半开连接者的IP,相当于下次连接时不会将其放入半开队列(等于丢弃)。
- ?DDOS(分布式拒绝服务攻击):指处于不同位置的多个攻击者同时向一个或数个目标发动攻击,或者一个攻击者控制了位于不同位置的多台机器(僵尸主机)并利用这些机器对受害者同时实施攻击。分布式的半开攻击用以上技术不能防御,只能依赖于僵尸网络库,或者代理技术,流量清洗技术来防御。
4.TCP的四次挥手(标准)
C? ? ? ?? ? ? ? ?——>FIN ? seq=M? ? ? ? ? ? ? ? ? ? ? ?S
C? ? ? ?? ? ? ? ?ack=M+1 ?ACK? ? <——? ? ? ? ? ? ? S
C? ? ? ? ? ? ? ? ? ? seq=N? ?FIN ? <——? ? ? ? ? ? ? ? S
C? ? ? ? ? ?? ? ?——>ACK? ack=N+1? ? ? ? ? ?? ? ? ?S?
? 以上为标准的4次挥手,也就是说可以有3次断开,把FIN ACK一次发送,2次断开? ?一般是服务为了节约资源
4.1 四次挥手
- 第一次挥手:客户端发送一个FIN,随机产生一个值seq=M,用来关闭客户端到服务器端的数据传送,客户端进入FIN-WAIT-1状态。意思是说我客户端没有数据要发给你了,但是如果你服务器端还有数据没有发送完成,则不必急着关闭连接,可以继续发送数据。
- 第二次挥手:服务器端收到FIN后,先发送ACK,ack=M+1,告诉客户端,你的请求我收到了,但是我还没准备好,请继续你等我的消息。这个时候客户端就进入FIN-WAIT-2 状态,继续等待服务器端的FIN报文。
- 第三次挥手:当服务器端确定数据已发送完成,则向客户端发送FIN,seq=N报文,告诉客户端,好了,我这边数据发完了,准备好关闭连接了。服务器端进入LAST-ACK状态。
- 第四次挥手:客户端收到FIN报文后,就知道可以关闭连接了,但是他还是不相信网络,怕服务器端不知道要关闭,所以发送ACK,ack=N+1后进入TIME-WAIT状态,如果Server端没有收到ACK则可以重传。服务器端收到ACK后,就知道可以断开连接了。客户端等待了2MSL后依然没有收到回复,则证明服务器端已正常关闭,那好,我客户端也可以关闭连接了。最终完成了四次握手。
?
四次断开解释图示
4.2 为什么要进行四次挥手
- 4次挥手目的是终止数据传输,客户端在发出FIN断开请求后,只是表示客户端已经没有数据要发送了,所以它告诉服务器,它的数据已经全部发送完毕了(一次挥手)。? 但是这时候客户端还是可以接受来自服务器的数据,服务器收到请求并不能做主,还需请求应用程序。 当服务器返回ACK报文段时,表示它已经知道客户端没有数据发送了,但是服务器还是可以发送数据到客户端的(二次挥手)。? 当服务器得到应用程序可以断开的指令时,服务器则会发送了FIN报文给客户端,这个时候就表示服务器也没有数据要发送,于是告诉客户端,我的数据也发送完了没有啦(三次挥手)。? 客户端在收到服务器的信息后返回ACK确实,表示达成一致双向确认(四次挥手)。之后彼此就会愉快的中断这次TCP连接。
注:以上是我身为一个小白的第一次发布,有对其他前辈的借鉴也有对老师知识的整理加上一点个人理解,如有错误望大佬们指正。
|