那些年,被咱们误解的TCP

引言

clipboard.png

最近在结合“慕课网”的实战课程《剑指Java面试-Offer直通车》复习基础知识,在复习计算机网络时,发现原来我在书上学的TCP相关知识是不许确的,不符合面试要求。面试

clipboard.png

这是我学习计算机网络时使用的课本,让咱们一块儿来见识见识真正的TCP服务器

学习

简介

TCP:全称Transmission Control Protocol,传输控制协议。TCP是面向链接的、可靠的、基于字节流的传输层通讯协议。网络

咱们天天都在用的HTTPHTTPS都是基于运输层的TCP协议。学习

TCP数据包格式

每一个TCP报文内都有序号和确认号,结合重传机制保障数据传输的可靠性。spa

clipboard.png

TCP报文中的下列三种表示十分重要。计算机网络

ACK:确认序号标志
SYN:同步序号,用于创建链接过程
FINfinish标志,用于释放链接3d

三次握手

TCP链接中最著名的要属三次握手了!code

clipboard.png

详解

第一次握手:创建链接时,客户端发送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状态,完成三次握手。

clipboard.png

为何须要三次握手才能创建起链接?

很是有深度的问题,非认真思考而不可达。

这是《计算机网络》一书中对此的解释。

clipboard.png

满满的两页,一句说到核心的都没有。

TCP三次握手的核心是交换ClientServer初始的Sequence Number

假设

咱们假设TCP链接中没有三次握手。咱们再假设通讯过程当中已经创建好了ClientServer的全双工通讯通道。

若是ClientServer发送数据包。该数据包编号是18888,长度是100

若是是正确收到,根据TCP的机制,应该回复ACKack = 18988

clipboard.png

若是是这个数据包时第一个数据包,这样是合理的,回复18988,意味着当前的18988以前的数据包都已经收到了,下一个期待的数据编号是18988

clipboard.png

假设ClientServer同时发送了两个数据包,1878818888,而18788由于网络的问题,传丢了。那服务器端再回复ACK就不合理了。

因此,在TCP链接中通讯的双方,都须要知道对方所开始发送数据的初始的Sequence Number。而为了完成这个任务,才有了TCP的三次握手。

三次握手

  1. 客户端发送它的Sequence Number初始值。
  2. 服务端确认收到。
  3. 服务端发送它的Sequence Number初始值。
  4. 客户端确认收到。

二、3两步能够进行合并,即服务端发一个TCP数据包就能够完成确认和发送本身的Sequence Number两项任务,因此就是三次握手。

总结

写书不易,出错时不免的,每位做者也都应该收到尊重。

可是毕竟做为教授万千学子的教科书,请求学校选择课本时请慎重。

相关文章
相关标签/搜索