TCP是什么, 有什么特征
TCP是一种面向广域网的通信协议,目的是在跨越多个网络通信时,为两个通信端点之间提供一条具有下列特点的通信方式.
- 基于流的方式;
- 面向连接;
- 可靠通信方式;
- 在网络状况不佳的时候尽量降低系统由于重传带来的带宽开销;
- 通信连接维护是面向通信的两个端点的,而不考虑中间网段和节点。
为满足TCP协议的这些特点,TCP协议做了如下规定:
① 数据分片
② 到达确认
③ 超时重发
④ 滑动窗口
⑤ 失序处理
⑥ 重复处理
⑦ 数据校验
为了判定当前处于什么状态. TCP有了种标识:SYN(建立联机)、ACK(确认)、PSH(传送)、FIN(结束)、RST(重置)、URG(紧急)
TCP建立连接 (三次握手)
TCP使用三次握手协议建立连接。当主动方发出SYN连接请求后,等待对方回答SYN+ACK,并最终对对方的 SYN 执行 ACK 确认。这种建立连接的方法可以防止产生错误的连接.
TCP三次握手的过程如下:
客户端发送
SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态。服务器端收到SYN报文,回应一个
SYN (SEQ=y)和ACK(ACK=x+1)报文,进入SYN_RECV状态。客户端收到服务器端的
SYN报文,回应一个
ACK(ACK=y+1)报文,进入Established状态。
三次握手完成,TCP客户端和服务器端成功地建立连接,可以开始传输数据了。
图片引用自csdn-青柚_
简单总结就是:
客户端发送包,说我要建立连接,等待服务端回复. 服务端接受到, 回答然后等待客户端回复. 客户端收到回复,回答. 服务端接收到. 两端都确认对方可以收到. 开始传输数据
TCP断开连接 (四次挥手)
终止一个连接要经过四次握手,这是由TCP的半关闭(half-close)造成的。具体过程如下:
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状态持续的时间。客户端收到服务器的确认请求后,此时,客户端就进入
FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
3️⃣服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,
FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
4️⃣客户端收到服务器的连接释放报文后,必须发出确认,
ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。服务器只要收到了客户端发出的确认,立即进入
CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。
图片引用自csdn-青柚_
简单总结:
听起来很复杂,其实就是需要一个相互确认的过程. 客户端发送终止请求, 服务端接受后返回一个收到, 但是继续传输数据,直到传输完成,再次发送一个完毕终止. 客户端收到回复可以终止.然后进入等待 ,服务端收到终止请求立即关闭. 经过2∗∗MSL(最长报文段寿命)的时间后, 客户端没有在收到回应,关闭.
常见面试题
- 为什么连接的时候是三次握手,关闭的时候却是四次握手?
读到这里这个问题就可以自由回答了, 没什么难度.
简单来说就是当连接建立完成了,在传输数据时想要终止,必须有一步,等待. 等待数据传输完成再关闭.
- 为什么
TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
因为每次传输数据并不一定是100%送达的.
所以TIME_WAIT状态就是用来重发可能丢失的ACK报文. Server如果没有收到ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。
如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。
- 为什么不能用两次/四次握手进行连接?
- 两次:
两次连接并不能让双方都确定对方是可接受数据状态.- 四次:
明明已经保证了一个稳定的传输流了,为什么还要浪费性能再去发一次消息,浪费了性能
- 如果已经建立了连接,但是客户端突然出现故障了怎么办?
TCP还设有一个保活计时器,俗称心跳. 服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。










网友评论