三次握手建立链接,四次挥手断开链接。这个问题算非常经典的问题,也是面试官非常喜欢问的问题。
不夸张的说,龙叔在校招面试的时候每一家公司都问到过关于三次握手和四次挥手相关的问题,相信大家也都差不多被面试官各种怼。
这个问题的重要性,已经意识到。不说废话了,接下来就是听龙叔给你安排的明明白白。
先画个图,看下TCP的建立连接 和 断开连接的整体过程。
tcp三次握手四次挥手
看完这个图相信聪明的你在整体对三次握手和四次挥手有了一些基本把控。但是,里面的细节肯定是会有些生疏或者模糊的,接下来就一个一个问题的揭露本质。
在解释之前先看点基础知识做做铺垫。
TCP状态转移解释
再看下TCP的报文格式
TCP报文格式
首部有20字节的固定长度,含义如下:
1.源端口和目的端口
各占2字节,就是存储源端口号和目的端口的
2.序号seq
占4字节,表示的范围就是整形的范围[0~2^32]。序号使用在给数据部分每个字节进行编号的,编号方式是mod 2^32 。
3.确认号ack
占4字节,范围也是无符号整数的范围。使用在对端传输给我的数据最后一个字节序号,例如A传输给B 101—500,此时B返回的确认号一定是小于等于501的。当B段正确接收数据之后才会返回确认号,换句话说确认号之前的数据已经全部接收。
4.数据偏移
占4bit,数据偏移很多人很容易想到是不是表示数据的长度,那就错了。偏移嘛,指的是TCP起始位置到数据部分的起始位置的偏移,也就是TCP首部的长度。
5.保留
占6bit,保留字段顾名思义,就是为今后使用,默认置为0。
6.紧急URG控制位
占用1bit,URG=1,表示紧急指针有效,此时tcp数据优先传输。相当于生活中的紧急通道,特殊情况时使用。
在网络中也会有特殊情况,例如,发送一个很长的程序在远程服务器上运行,此时发现程序有bug,需要中断运行,因此我们从键盘输入Ctrl c,假如不使用紧急数据,需要在缓冲区里排队,都知道是bug了,还要排队,这怕是要出锅啊。
此时使用紧急数据传输,不需要排队,直接中断程序是不是更符合我们的预期。
需要注意一点是,即使窗口为0时,也可以发送紧急数据。
如何使用紧急URG控制位,在socket编程中send函数flag参数
send(int socket, const void *buffer, size_t length, int flags);
flags参数传MSG_OOB宏时,表示此时有紧急数据。MSG_OOB是个宏,
7.确认ACK
占1bit,当ACK=1时生效。TCP有条硬性规定