这是我参与更文挑战的第1天,活动详情查看: 更文挑战
昨晚参加完小组分享,再次听到了“三次握手”,也是第一次听到“四次挥手”,晚上回去看了下宝典,碰巧在“从输入URL到页面展现的全过程”当中也看到了这些概念,现在我就全面学习下。(主要原因是由于最近时间比较所图片) 三次握手: 三次握手相关的操作都在TCP报文段的首部,那么相关的操作是什么?TCP是什么?TCP报文段是什么?首部又是什么呢?相关的操作我们先不说,看下另外三个问题,首先,我们看下TCP/IP: TCP/IP 是用于因特网 (Internet) 的通信协议! TCP 用于应用程序之间的通信! IP 用于计算机之间的通信! 然后看下OSI七层网络模型和TCP/IP四层概念模型(从下向上看哦):
从上图可以看出,TCP就是传输层用到的协议。
TCP报文是TCP层传输的数据单元,也叫报文段,一个报文段包括首部和数据两部分。首部就是报文段的首部。至此,TCP报文段的首部我们已经知道是什么意思了,接下来看下三次握手相关的操作:
操作什么呢?我们看下首部的结构图:
图片
我们从上往下看,可以看出,首部内容太多了,毕竟TCP的全部功能体现在它首部中的各字段的作用。首部有20字节的固定首部,还有长度可变的选项,所以首部最小长度是20字节。我们重点看红色框框里面的部分,分别是seq,urgent, Acknowledge character,push,reset,Synchronize Sequence Numbers,final的缩写(seq不是缩小):
序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号seq就是这个报文段中的第一个字节的数据编号。
确认号ack:占4个字节,期待收到对方下一个报文段的第一个数据字节的序号;序列号表示报文段携带数据的第一个字节的编号;而确认号指的是期望接收到下一个字节的编号;因此当前报文段最后一个字节的编号+1即为确认号。
确认ACK:占1位,仅当ACK=1时,确认号字段才有效。ACK=0时,确认号无效。
同步SYN:连接建立时用于同步序号。当SYN=1,ACK=0时表示:这是一个连接请求报文段。若同意连接,则在响应报文段中使得SYN=1,ACK=1。因此,SYN=1表示这是一个连接请求,或连接接受报文。SYN这个标志位只有在TCP建立连接时才会被置1,握手完成后SYN标志位被置0。
终止FIN:用来释放一个连接。FIN=1表示:此报文段的发送方的数据已经发送完毕,并要求释放运输连接。
接下来我们看下三次握手的过程图:
第一次握手:SYN为1,序列号seq为x(这不能说明什么)
第二次握手:SYN为1,确认号ACK为1(这样确认号才有效),序列号seq为y,确认号ack为x+1(因为服务端已经收到了x,所以期待下次收到的为x+1,说明服务端和客户端通信正常) 第三次握手:ACK为1,确认号为y+1(说明客户端和服务端通信正常) 四次挥手:
第一次挥手:客户端和服务端说,我要关闭连接了,客户端进入终止等待1状态 第二次挥手:服务端说你等会,我报告下上层服务器,看看还有没有数据要发给你,服务端进入关闭等待状态 第三次挥手:服务端收到服务器的被动关闭后,告诉客户端,可以关闭连接了,服务端进入最后确认状态 第四次挥手:客户端收到后,告诉服务端可以关闭了,服务端收到后关闭,客户端进入时间等待状态,等待2MSL时间后关闭 到此为止,我们知道了“三次挥手”和“四次握手”的意思了,最后再看一张图:
这是TCP的通信流程,可以看到三次握手建立TCP连接后,开始http交互,交互完成,开始四次挥手断开连接,从相识的握手到挥手的离别,分手的很快,也很耗资源。但是,http1.1协议里增加了Keep-Alive,可以设置长连接时间,时间到了之后,再进行四次挥手。