网络层比特 卧槽!牛皮了,头一次见有大佬把TCP三次握手四次挥手解释的这么明白
TCP三路握手
在计算机网络的基本概念中,层次结构是最基本的。计算机网络体系结构有很多抽象概念,学习时需要多思考。这些概念对于后续的学习会有帮助。
什么是网络协议?
为了在计算机网络中有序地交换数据,必须遵守一些预先约定的规则,例如交换数据的格式以及是否需要发送响应消息。这些规则称为网络协议。
为什么要分层网络协议?
网络协议分层的缺点:功能可能出现在多个层中,导致额外的开销。
为了使不同架构的计算机网络能够互连,国际标准化组织ISO于1977年提出了一个试图将全世界各种计算机互连起来的标准框架,即著名的开放系统互连基本参考模型OSI/RM。 ,简称OSI。
OSI的七层协议架构概念清晰,理论也比较完整,但复杂且不实用。 TCP/IP 体系结构有所不同,但现在已广泛使用。 TCP/IP是一个四层体系结构,包括应用层、传输层、网际层和网络接口层(网际层这个名字强调的是这一层是为了解决不同网络的互连问题),但本质上一般来说,TCP/IP只有最上面三层,因为最下面的网络接口层没有任何具体的内容。因此,在学习计算机网络原理时,往往会采用一种折中的做法,即结合OSI和TCP/IP的优点。采用只有五层协议的架构,既简洁又能够清晰地解释概念。有时为了方便起见,底层两层也可称为网络接口层。
四层协议、五层协议、七层协议的关系如下:
注:五层协议架构只是为了介绍网络原理而设计的。实际应用仍然是TCP/IP四层架构。
TCP/IP协议族应用层
应用层(Layer)的任务是通过应用进程之间的交互来完成具体的网络应用。应用层协议定义了应用程序进程(进程:运行在主机上的程序)之间通信和交互的规则。
不同的网络应用需要不同的应用层协议。互联网中有很多应用层协议,例如域名系统DNS、支持万维网应用的HTTP协议、支持电子邮件的SMTP协议等等。
传输层
传输层(层)的主要任务是为两个主机进程之间的通信提供通用的数据传输服务。应用进程使用该服务来传输应用层消息。
传输层主要使用两种协议:
传输控制协议-TCP:提供面向连接的、可靠的数据传输服务。
用户数据协议 - UDP:提供无连接、尽力而为的数据传输服务(不保证数据传输的可靠性)。
每个应用层(TCP/IP 参考模型的最高层)协议通常使用两个传输层协议之一:
TCP协议上运行的协议:
运行在UDP协议上的协议:
在 TCP 和 UDP 协议上运行:
网络层
网络层的任务是选择合适的网间路由和交换节点,保证计算机通信数据的及时传输。网络层在发送数据时,将传输层生成的报文段或用户数据报封装成报文或数据包进行传输。在TCP/IP架构中,由于网络层使用IP协议,因此报文也称为IP数据报,简称数据报。
互联网是由大量异构()网络通过路由器()相互连接而成。 使用的网络层协议是无连接的协议(IP)和许多路由协议,因此的网络层也称为层或IP层。
数据链路层
数据链路层通常称为链路层。两台主机之间的数据传输总是通过链路进行传输,这就需要使用专门的链路层协议。
当在两个相邻节点之间传输数据时,数据链路层将网络层移交的IP数据报组装成帧,并在两个相邻节点之间的链路上传输该帧。每帧包括数据和必要的控制信息(如同步信息、地址信息、差错控制等)。
接收数据时,控制信息使接收端知道帧从哪一位开始和结束。
一般Web应用的通信传输流程如下:
发送方在层间传输数据时,每经过一层,就会被标记上属于该层的头信息。相反,接收端在层间传输数据时,每经过一层就会去掉相应的头信息。
物理层
物理层传输的数据单位是比特。物理层的作用是实现相邻计算机节点之间比特流的透明传输,并尽可能屏蔽特定传输介质和物理设备之间的差异。它上面的数据链路层不必考虑网络的具体传输介质。 “比特流透明传输”是指比特流经过实际电路传输后没有发生变化。该电路对于传输的比特流来说似乎是不可见的。
TCP/IP协议族
在 上使用的各种协议中,最重要和众所周知的是 TCP/IP。现在人们经常提到的TCP/IP并不一定是指TCP和IP这两个具体协议,而往往是指互联网所使用的整个TCP/IP协议族。
互联网协议簇(英文:Suite,缩写IPS)是一种网络通信模型和整个网络传输协议族,是互联网的基本通信架构。通常称为TCP/IP协议簇(英文:TCP/IP Suite,或TCP/IP),简称TCP/IP。因为这个协议族的两个核心协议:TCP(传输控制协议)和IP(互联网协议),是该家族中最早采用的标准。
亮点:
TCP(传输控制协议)和IP(网际协议)是最先定义的两个核心协议,因此统称为TCP/IP协议族。
TCP三次握手和四次挥手
TCP是一种面向连接、可靠、基于字节流的传输层通信协议。在发送数据之前,通信双方必须建立彼此之间的连接。所谓“连接”,其实就是客户端和服务器保存的一条关于彼此的信息,比如IP地址、端口号等。
TCP 可以被视为处理 IP 层或以下层的数据包丢失、重复和错误的字节流。在连接建立过程中,双方需要交换一些连接参数。这些参数可以放置在 TCP 标头中。
TCP 连接由一个 4 元组组成,即两个 IP 地址和两个端口号。 TCP连接通常分为三个阶段:连接、数据传输、退出(关闭)。通过三向握手建立链接,通过四向挥手关闭连接。
当建立或终止连接时,交换的段仅包含 TCP 标头,不包含数据。
TCP报文头结构
在了解TCP连接之前,我们先了解一下TCP报文的报头结构。
上图中有几个字段需要突出显示:
(1)序列号:seq序列号,32位,用于标识TCP源发送到目的地的字节流。发起者在发送数据时对此进行标记。
(2) 确认序列号:ack序列号,占用32位。确认序列号字段仅在ACK标志位为1时有效,ack=seq+1。
(3)标志位:共6个,分别是URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:
需要注意的事项是:
三次握手
三次握手的本质是确认通信双方发送和接收数据的能力。
首先,我让快递员将一封信运送给对方。如果对方收到了,那么他就知道我的发送能力和他的接收能力是可以接受的。
于是他回复了我。如果我收到了,我就知道我的发送能力和他的接收能力是可以接受的,他的发送能力和我的接收能力是可以接受的。
不过这个时候他还不知道他的发送能力和我的接收能力是否可以接受,所以我还了最后一次。如果他收到了,他就知道他的发送能力和我的接收能力是可以接受的。的。
这是三次握手。你明白吗?
挥手四次
挥手四次的目的是关闭连接
例如,客户端初始化的序列号为ISA=100,服务器端初始化的序列号为ISA=300。 TCP连接成功后,客户端总共发送1000字节的数据,服务器回复总共2000字节的数据,然后客户端发送FIN报文。
常见面试问题:为什么TCP连接需要3次?不是可以做两次吗?
因为需要考虑连接过程中丢包的问题,如果只有2次握手,如果在第二次握手时服务器发送给客户端的确认消息段丢失,则服务器已经准备好发送和接收数据了(可以理解为服务器已经连接成功),但是客户端还没有收到服务器的确认消息,所以客户端不知道服务器是否准备好(可以理解为客户端还没有连接成功) )。在这种情况下,客户端不会给服务器发送数据,同时也会忽略服务器发送的数据。
如果是三次握手,即使出现丢包也没有问题。例如,如果第三次握手中客户端发送的确认ack消息丢失,而服务器在一段时间内没有收到确认ack消息,则会重试第三次握手。两步握手,即服务器会重新发送SYN报文段。客户端收到重发的报文段后,会再次向服务器发送确认ack消息。
为什么TCP连接时是3次,而关闭时却是4次?
因为TCP只有在客户端和服务器都没有数据要发送的情况下才能断开连接。当客户端发送FIN报文时,只能保证客户端没有数据要发送。客户端不知道服务器是否有数据要发送。服务器收到客户端的FIN报文后,只能回复客户端一个确认报文,告诉客户端服务器已经收到你的FIN报文了,但是还有一些数据没有发送出去。服务器只有在所有数据都发送完毕后才能向客户端发送FIN报文(所以确认报文和FIN报文不能一次发送给客户端,因为这里有一个额外的时间)。
为什么客户端发送第四次挥手确认报文后要等待2MSL才能释放TCP连接?
这里我们还需要考虑丢包的问题。如果第四次挥手的消息丢失并且服务器没有收到确认ack消息,它将重新发送第三次挥手的消息。这将需要最长的时间才能返回消息。是2MSL,所以需要这么长时间才能确认服务器确实收到了。
如果连接建立了但是客户端突然失败怎么办?
TCP 有一个保持活动定时器。如果客户端出现故障,服务器无法永远等待,浪费资源。服务器每次收到客户端的请求时都会重置该计时器。时间一般设置为2小时。如果两个小时内没有收到客户端的任何数据,服务器将每75秒发送一个检测段。每秒发送一次。如果连续发送10个探测报文后仍然没有响应,服务器就会认为客户端出现故障,然后关闭连接。