OSI七层模型TCPIP五层模型三次握手四次挥手

OSI参考模型,是一个开放性的通信系统互连参考模型,他是一个定义得非常好的协议规范。

OSI(Open System Interconnect)由ISO(International Organization for Standardization)国际化标准组织提出

OSI七层模型TCPIP五层模型三次握手四次挥手
OSI模型有7层结构,每层都可以有几个子层。 OSI的7层从上到下分别是

  • 7、应用层;
  • 6、表示层;
  • 5、会话层;
  • 4、传输层;
  • 3、网络层;
  • 2、数据链路层;
  • 1、物理层;

TELNET、HTTP、HTTPS、FTP、POP3、SMTP、DNS、NFS等属于第七层应用层的概念。

JPEG、MPEG、ASII等属于第六层表示层的概念。

NFS、SQL、NETBIOS、RPC等属于第五层会话层的概念。

TCP、UDP等属于第四层传输层的概念。

IP、ICMP、ARP、RARP、OSPF、IPX、RIP、IGRP、 (路由器)等属于第三层网络层的概念。

PPP、FR、HDLC、VLAN、MAC (网桥,交换机)等属于第二层数据链路层的概念。

RJ45、CLOCK、IEEE802.3 (中继器,集线器)等属于第一层物理层概念

其中高层(即7、6、5、4层)定义了应用程序的功能,下面3层(即3、2、1层)主要面向通过网络的端到端的数据流。

在这七层模型种,高层次都是依赖于低层次的。层次越高,使用起来越方便。


DNS:域名系统(服务)协议(DNS)是一种分布式网络目录服务,主要用于域名与 IP 地址的相互转换,以及控制因特网的电子邮件的发送。

DNS多级解析

首先是在浏览器中有一个DNS缓存,如果找不到就在本机地址的hosts文件中查找,再找不到就去路由器缓存中查找。然后是本地DNS服务器,如果没有,就是根服务器,*服务器,权限域名服务器等等等。
总之,在每一级都有可能缓存这DNS的对应关系,所以有可能当某一台真实服务器下线之后,修改了DNS服务器的记录,但在生效之前还有一段时间,在这段期间,其IP地址已经不可用了,通过域名进行访问时还是会访问到这个IP地址。会访问失败


与七层模型相比TCP/IP五层模型更加简化:
OSI七层模型TCPIP五层模型三次握手四次挥手


三次握手:

  • C:发送同步信号SYN包和seq号x请求连接
  • S:收到同步信号SYN包记录C的seqx,返回自己的SYN包、ACK包和seq号x+1,seq号y确认可以连接
  • C:发送确认包ACK,seq号x+1,seq号y+1开始连接

四次挥手:

  • C:发送释放报文FIN,seq=u。
  • S:收到释报文,发出确认报文ACK=1,ack=u+1,seq=v。准备关闭。
  • S:关闭连接,发送FIN,seq=w,准备完毕可以关闭。
  • C:收到FIN,ACK=1,ack=w+1,可以关闭。
    S收到后关闭,C过一段时间没收到回复自动关闭。

两个字段

  • 序号:Seq
  • 确认号:ACK=Seq + 1

六个标志:

  • SYN 请求建立连接,并在其***的字段进行***的初始值设定。建立连接,设置为1
  • ACK 确认号
  • PSH 传输,提示接收端应用程序立即从TCP缓冲区把数据读走。
  • FIN 结束,希望断开连接。
  • URG 紧急指针是否有效。为1,表示某一位需要被优先处理
  • RST 重新建立连接,复位。

三次握手核心:既要保证数据可靠传输,又要提高传输的效率,而用三次恰恰可以满足以上两方面的需求。

常见问题

【问题1】为什么连接的时候是三次握手,关闭的时候却是四次握手?

答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

【问题2】为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。在Client发送出最后的ACK回复,但该ACK可能丢失。Server如果没有收到ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。

【问题3】为什么不能用两次握手进行连接?

答:3次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始***进行协商,这个***在握手过程中被发送和确认。

现在把三次握手改成仅需要两次握手,死锁是可能发生的。作为例子,考虑计算机S和C之间的通信,假定C给S发送一个连接请求分组,S收到了这个分组,并发 送了确认应答分组。按照两次握手的协定,S认为连接已经成功地建立了,可以开始发送数据分组。可是,C在S的应答分组在传输中被丢失的情况下,将不知道S 是否已准备好,不知道S建立什么样的***,C甚至怀疑S是否收到自己的连接请求分组。在这种情况下,C认为连接还未建立成功,将忽略S发来的任何数据分 组,只等待连接确认应答分组。而S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。

【问题4】如果已经建立了连接,但是客户端突然出现故障了怎么办?

TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。


参考:博客园

参考:简书

参考:CSDN