一 为什么搞这个?
从今天开始,尽量再多更一篇基础知识,基本都是面试时的高频基础知识问题,会包括网络+操作系统+组成原理,一来帮大家回忆,二来通过面试。毕竟作为一名工程师,底子要深厚,生产时出了错,知道原理,就会有底气得多~而原理,都是来源于我们学习的基础知识~
二 今天先来网络的,TCP三次握手
网络协议中,TCP是多么地重要,不用我多说,今天先给大家讲一下三次握手~
从网上找一张图:
三 开讲!
1.先解释下名词:
SYN,同步序号,是1,它表示建立连接。TCP规定SYN=1时不能携带数据,但要消耗一个序号。因此随机选取一个seq=x的数据包。
ACK,确认序号,是1,它表示响应。都响应了,那么上一次连接就是成功的
seq,序列号,发送端数据包的初始序号,表示发送端数据包的初始序列号为x,为第x号帧。
ack,确认号,表示对收到数据包的确认,以及对下次收到数据包的期待。ack=x+1,表示我方对到x为止的数据包都收到了,且告知对方:我期待你下次给我发送的数据包的序列号为x+1。
为了方便理解,大家可以认为,SYN和ACK是协议层面的标记、seq和ack是数据方面的标记
2.三次握手
(1)第一次握手
客户端建立连接,SYN=1
此时客户端进入syn_sent状态,表示等待服务端的回复。
(2)第二次握手
服务端确认,并,建立连接
所以ACK=1,SYN=1
(3)第三次握手
四 经典面试题
Q:为什么TCP需要三次握手,而不是两次握手?
答:谢希仁版《计算机网络》中,是这样解释的:
主要是为了防止已失效的连接请求报文段,突然又传到了服务端。
对于客户端A和服务端B
我们假定出现了这样一种异常情况:即客户端A发出的,第一个连接请求报文段,并没有丢失,而是在某些网络节点长时间滞留了,一直到,连接释放之后的某个时间,才到达服务端B。本来这是一个早已失效的报文段,但B就会认为,这是A发出的一次新的连接请求,于是向A发送了确认连接。对于两次握手来说,B发送了确认连接,就建立起了TCP连接,这样B一直等待A发送数据包,服务端的很多资源就白白浪费了。
五 总结
明天预告:二叉树+四次挥手