请看图

序列号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示意:此报文段的发送方的数据曾经发送结束,并要求开释运输连贯

PS: ACK、SYN和FIN这些大写的单词示意标记位,其值要么是1,要么是0;ack、seq小写的单词示意序号。

三次握手过程了解

第一次握手:建设连贯时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,期待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时本人也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送结束,客户端和服务器进入ESTABLISHED(TCP连贯胜利)状态,实现三次握手。

四次挥手过程了解

1)客户端过程收回连贯开释报文,并且进行发送数据。开释数据报文首部,FIN=1,其序列号为seq=u(等于后面曾经传送过去的数据的最初一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止期待1)状态。TCP规定,FIN报文段即便不携带数据,也要耗费一个序号。

2)服务器收到连贯开释报文,收回确认报文,ACK=1,ack=u+1,并且带上本人的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(敞开期待)状态。TCP服务器告诉高层的利用过程,客户端向服务器的方向就开释了,这时候处于半敞开状态,即客户端曾经没有数据要发送了,然而服务器若发送数据,客户端仍然要承受。这个状态还要继续一段时间,也就是整个CLOSE-WAIT状态继续的工夫。

3)客户端收到服务器的确认申请后,此时,客户端就进入FIN-WAIT-2(终止期待2)状态,期待服务器发送连贯开释报文(在这之前还须要承受服务器发送的最初的数据)。

4)服务器将最初的数据发送结束后,就向客户端发送连贯开释报文,FIN=1,ack=u+1,因为在半敞开状态,服务器很可能又发送了一些数据,假设此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最初确认)状态,期待客户端的确认。

5)客户端收到服务器的连贯开释报文后,必须收回确认,ACK=1,ack=w+1,而本人的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(工夫期待)状态。留神此时TCP连贯还没有开释,必须通过2∗∗MSL(最长报文段寿命)的工夫后,当客户端撤销相应的TCB后,才进入CLOSED状态。

6)服务器只有收到了客户端收回的确认,立刻进入CLOSED状态。同样,撤销TCB后,就完结了这次的TCP连贯。能够看到,服务器完结TCP连贯的工夫要比客户端早一些。

常见面试题

为什么连贯的时候是三次握手,敞开的时候却是四次握手

答:因为当Server端收到Client端的SYN连贯申请报文后,能够间接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。然而敞开连贯时,当Server端收到FIN报文时,很可能并不会立刻敞开SOCKET,所以只能先回复一个ACK报文,通知Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我能力发送FIN报文,因而不能一起发送。故须要四步握手。

为什么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次握手实现两个重要的性能,既要单方做好发送数据的筹备工作(单方都晓得彼此已筹备好),也要容许单方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。

当初把三次握手改成仅须要两次握手,死锁是可能产生的。作为例子,思考计算机S和C之间的通信,假设C给S发送一个连贯申请分组,S收到了这个分组,并发送了确认应答分组。依照两次握手的协定,S认为连贯曾经胜利地建设了,能够开始发送数据分组。

可是,C在S的应答分组在传输中被失落的状况下,将不晓得S 是否已筹备好,不晓得S建设什么样的序列号,C甚至狐疑S是否收到本人的连贯申请分组。在这种状况下,C认为连贯还未建设胜利,将疏忽S发来的任何数据分组,只期待连贯确认应答分组。而S在收回的分组超时后,反复发送同样的分组。这样就造成了死锁。

如果曾经建设了连贯,然而客户端忽然呈现故障了怎么办

答:TCP还设有一个保活计时器,显然,客户端如果呈现故障,服务器不能始终等上来,白白浪费资源。服务器每收到一次客户端的申请后都会从新复位这个计时器,工夫通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,当前每隔75分钟发送一次。若一连发送10个探测报文依然没反馈,服务器就认为客户端出了故障,接着就敞开连贯。

写在最初

欢送大家关注我的公众号【惊涛骇浪如码】,海量Java相干文章,学习材料都会在外面更新,整顿的材料也会放在外面。

感觉写的还不错的就点个赞,加个关注呗!点关注,不迷路,继续更新!!!

视频解说:每个程序员必备的网络常识:计算机网络底层原理150分钟深度分析!

  1. 从一个HTTP申请来看网络分层原理
  2. TCP协定底层常识还记得吗
  3. TCP三次握手四次挥手是咋回事
  4. 什么是粘包半包,怎么来的
  5. 什么是连贯,什么是可靠性传输
  6. 散列算法/对称加密/非对称加密
  7. HTTPS平安加密通道原理分析