这是一个计算机网络中一个很热门,很基础的问题,也是面试常考的一个题,若是你会那不稀奇,若是你不会,那就会凉凉。我这里来对我学的东西作一个整理,看完时候对这里的知识应该会很清晰。首先先来名词解释,若是遇到不清晰的名词,记得反过头来看。面试
TCP
:TCP
在计算机网络模型的传输层,对应的是主机到主机的传输,为应用间通讯提供能力。TCP
是一个双工协议,数据任什么时候候均可以双向传输,这就意味着客户端和服务端能够平等地发送、接收信息。编程
连接:是传输层的概念,连接是一种传输数据的行为,是网络行为状态的记录。在传输以前,创建一个连接,就是在数据收发双方的内存中都创建一个用于维护数据传输状态的对象,里面记录了双方的IP
和端口号,状态是怎样,传输速度是如何等。后端
双工/单工:服务器
名称 | 概念 | 线路数量 |
---|---|---|
单工 | 在任何一个时刻,若是数据只能单向发送 | 只需1条( =1 ) |
半双工 | 在某个时刻数据能够向一个方向传输,也能够向另外一个方向反方向传输,并且交替进行 | 至少 1 条( >= 1 ) |
全双工 | 任什么时候刻数据均可以双向收发 | 大于 1 条( >1 ) |
TCP
的握手目的是为了创建稳定的连接通道。TCP
的挥手目的是为了断开连接。WSL(Maximum Segment Lifetime)
:报文最大生存时间,TCP容许不一样的实现能够设置不一样的WSL值。seq
序号:用来标识从TCP
源端向目的端发送的字节流,发起方发送数据时对此进行标记📌。ack
肯定序号:只有ACK
标志为1时,确认序号字段才有效,ack = seq + 1
SYN(Synchronization)
:一个 Host
主动向另外一个 Host
发起链接,请求同步。ACK(Acknowledgement)
:由于要保持链接和可靠性约束,TCP
协议要保证每一条发出的数据必须给返回。接收方收到数据后,都须要给发送方一个响应确认序号有序。RST(Reset)
:重置连接FIN(Finish)
:一个Host
主动断开请求,请求完成PSH(Push)
:一个 Host
给另外一个Host
发送数据,数据推送TCP
的三次握手,相对来讲是一个比较完整的机制,旨在创建稳定的传输通道。markdown
下面来看一下TCP
创建连接的6个步骤:网络
(SYN)
(SYN)
给一个(ACK)
(SYN)
给客户端(ACK)
其中,2和5步骤是不须要进行握手的,3和4是能够合并到一块儿的。因此虽然创建连接要6步可是只须要三次握手,分别是1,3+4,6。并发
下面咱们把三次握手的过程还原一下:app
CLOSED
的状态,客户端发送SYN=1
给服务端表示要求创建连接,而且发送了一个seq
序号,这个时候客户端的状态变成SYN-SEND
。ACK=1
表示确认收到,还有ack肯定序号,是上一个seq
序号+1
,即x+1
,还有本次的seq
序号y
,还有一个SYN=1
创建连接,这个时候服务端状态变成SYN-REVD
。ACK=1
表示确认收到,还有一个新的seq
序号是x+1
,还有一个ack
肯定序号是上一个seq
序号+1
,即y+1
。完成以后客户端的状态编程ESTABLISHED
。ESTABLISHED
,连接通道创建。简要总结就是:ui
设想一下,若是只有两次,服务端尚未肯定客户端是否准备好了,这样是没法稳定的进行数据传输的。若是四次,服务端根据客户端的ACK
再给客户端回复一个ACK
,没有什么很大的做用还形成资源浪费,那就是很没有必要的事情了。三次正好既能够保证可靠传输,也能够提升传输效率,url
TCP
的挥手旨在把连接状态断开
(FIN)
。(ACK)
。 ACK
;也有可能服务端本身有资源要释放等。(FIN)
。FIN
,处理本身完成的事情,好比客户端有发送给服务端没有收到 ACK
的请求等。(ACK)
。其中3和5是不须要进行挥手的,可是注意这里,2和4是没法合并的。因此这里须要四次挥手,分别是1,2,4,6。
FIN=1
要断开连接,而且发送了一个seq
序号=u
,这个时候客户端变成FIN-WAIT1
。ACK=1
肯定消息,还有ack
确认序号,是上一个seq
序号+1
,即u+1
,还有一个新的seq
序号为v
,此时服务端的状态变成CLOSE-WAIT
,客户端收到消息以后,状态会变成FIN-WAIT2
。ACK=1
,还要发送ack
确认序号,上一个seq
序号+1
,即u+1
,还有一个新的seq
序号为w
,还要发送一个FIN=1
。若是有以前没有发送完的数据,会跟着此次请求一并发送给客户端。此时服务端的状态变成LASE-ACK
。ACK=1
确认消息,还发送了ack
确认序号,上一个seq
序号+1
,即w+1
,还有一个新的seq
序号为u+1
,而后客户端的状态就变成了TIME-WAIT
,这种状态会持续2WSL
,若是等待的这段时间再也不收到后端的消息,2WSL
以后会变成CLOSED
。服务端接收到消息以后,状态也变成CLOSED
。简要总结就是:
由于断开连接服务端接收到FIN
时,断开链接要处理的问题比较多,不能直接关闭连接,这个时候若是不发送ACK
回应说是内容收到了,客户端是没法判断这个消息服务端收到没有,不能让客户端在这种状况下等过久,因此应该先回复一个ACK
报文说是收到了,你等会我这里还有事情要处理。等到服务端的事情都处理完毕了,再发送一个FIN
,肯定能够断开连接了。
ACK
报文能够到达服务器,若是这个ACK
报文丢失,服务器会以为客户端没有收到我发的请求断开报文,因而服务器就会重发一次,若是客户端在这个2MSL
时间段内收到重传的报文,就会从新给出回应报文,还会重启2MSL
计时器。2WSL
时间中,可使本连接持续时间内产生的全部报文段从网络中消失,这样新的TCP
三次握手的时候就不会出现旧连接中失效的请求报文。TCP
在传输层,对应主机到主机的传输,为应用通讯提供能力,且TCP
是一个双工协议,为了保证双方都创建稳定而高效的数据传输,使用三次握手和四次挥手的工做机制。
三次握手的步骤是:
SYN
创建连接的请求 (大哥,能创建连接吗?)
ACK+SYN
打包为一条消息回复 (老妹儿,我收到你的消息了,能够进行连接,你收到了吗?)
ACK
做为回复 (好嘞,走起~)
,这个时候数据传输通道创建。为何不是两次,是由于客户端不返回ACK
,那么服务端不知道客户端有没有接收到消息,若是是四次,根据ACK
再返回一次ACK
,浪费带宽且没有必要。
四次挥手的步骤是:
FIN
断开连接的请求 (大哥,我这边东西都发完了,断开连接吧~)
ACK
进行回复 (老妹儿?要断开连接?我知道了,你稍等会儿啊)
FIN
给客户端 (我这边完事儿了,断开连接吧~)
ACK
给服务端 (好嘞,掰掰~)
,这个时候数据传输通道断开。为何这里是四次,是由于断开连接服务端收到FIN
的时候,还有一些事情要处理,须要一些时间,这个时候不能让客户端等过久,因此先回复一个ACK
表示消息已经收到了,这边有东西要处理稍微等一下。等到事情处理完,再给客户端发送FIN赞成断开连接。
其实这个很好理解,在生活中,咱们收到对方发送的一个文件或者一个视频,这个时候他们须要咱们根据内容进行回复或者点评。咱们应该先说一句内容收到了,我看看给你回复,这样不会让对方有疑问半天没有回复是没有收到仍是收到了正在看。等咱们看完以后再告诉对方他们要的结果。