最近在结合“慕课网”的实战课程《剑指Java
面试-Offer
直通车》复习基础知识,在复习计算机网络时,发现原来我在书上学的TCP
相关知识是不许确的,不符合面试要求。面试
这是我学习计算机网络时使用的课本,让咱们一块儿来见识见识真正的TCP
!服务器
TCP
:全称Transmission Control Protocol
,传输控制协议。TCP
是面向链接的、可靠的、基于字节流的传输层通讯协议。网络
咱们天天都在用的HTTP
、HTTPS
都是基于运输层的TCP
协议。学习
TCP
数据包格式每一个TCP
报文内都有序号和确认号,结合重传机制保障数据传输的可靠性。spa
TCP
报文中的下列三种表示十分重要。计算机网络
ACK
:确认序号标志SYN
:同步序号,用于创建链接过程FIN
:finish
标志,用于释放链接3d
TCP
链接中最著名的要属三次握手
了!code
第一次握手:创建链接时,客户端发送SYN ( seq = x )
包到服务器,同时进入SYN_SEND
状态,等待服务器确认。blog
第二次握手:服务器收到SYN
包,必须确认客户的SYN ( ack = x + 1 )
,同时本身也发送一个SYN ( seq = y )
包,即SYN + ACK
包,此时服务器进入SYN_RECV
状态。ip
第三次握手:客户端收到服务器的SYN + ACK
包,向服务器发送确认包ACK ( ack = y + 1 )
,此包发送完毕,客户端和服务器进入ESTABLISHED
状态,完成三次握手。
很是有深度的问题,非认真思考而不可达。
这是《计算机网络》一书中对此的解释。
满满的两页,一句说到核心的都没有。
TCP
三次握手的核心是交换Client
和Server
初始的Sequence Number
。
咱们假设TCP
链接中没有三次握手。咱们再假设通讯过程当中已经创建好了Client
到Server
的全双工通讯通道。
若是Client
给Server
发送数据包。该数据包编号是18888
,长度是100
。
若是是正确收到,根据TCP
的机制,应该回复ACK
,ack = 18988
。
若是是这个数据包时第一个数据包,这样是合理的,回复18988
,意味着当前的18988
以前的数据包都已经收到了,下一个期待的数据编号是18988
。
假设Client
和Server
同时发送了两个数据包,18788
和18888
,而18788
由于网络的问题,传丢了。那服务器端再回复ACK
就不合理了。
因此,在TCP
链接中通讯的双方,都须要知道对方所开始发送数据的初始的Sequence Number
。而为了完成这个任务,才有了TCP
的三次握手。
Sequence Number
初始值。Sequence Number
初始值。二、3
两步能够进行合并,即服务端发一个TCP
数据包就能够完成确认和发送本身的Sequence Number
两项任务,因此就是三次握手。
写书不易,出错时不免的,每位做者也都应该收到尊重。
可是毕竟做为教授万千学子的教科书,请求学校选择课本时请慎重。