【计网】TCP的三次握手和四次挥手

来源:互联网 发布:淘宝少女前线初始号 编辑:程序博客网 时间:2024/05/16 18:27

昨天被360的笔试虐到了。。。=  =。。。。辣么多道C++。。。。引号还不能好好打,用中文的,我还以为选项是错的。。TAT

不过考了几道前端题也发现TCP的过程还是不大了解。。这么经典的题目。。

几个字段:

SYN(synchronize)=> 在创建连接的时候用

ACK(acknowledge number)=> 用于确认序号

SEQ(sequence number)=> 用于识别序号

FIN => 在结束连接的时候发送(没找到全称。。。)

TCP的报文分成两块,头部块和数据块。头部一般是20字节(UDP的头部是八个字节),包含了源端口号,目的端口号和其他的字段。传送数据的大小一般根据本地的最大链路层帧长度(就是看网络层最多能传输的数据大小,MSS)。如果传输的数据比较大,TCP会把它分成data_size/(每个报文携带的数据大小)这么多个报文段发送,并且会为每个报文分配相应的序号来使对方可以识别顺序。由于接收方(B)需要根据先后收到的数据来把文件拼接起来,所以判断报文的顺序很重要。

在传输的时候,对于任何一端,ACK表示自己要发送的数据的对应序号,SEQ表示期望从对方那里收到的序号。


上图客户端发送序号为42的数据,等待序号为79的数据。服务器返回序号为79的数据,并且刚刚收到了序号为42的数据,所及期待序号问43的数据。

这样来回来确认自己收到的数据是有序的。

在这个基础上来看TCP连接刚刚建立的时候。


三次握手:(isn是起始的序号)



TCP的三次握手的报文是特殊的报文,成为SYN报文。因为要建立连接,所以头部的SYN字段设为1,并且发送客户端的起始序号ACK(随机选取,减少和之前的连接序号冲撞)。服务器接收到后同意建立连接,就把他的报文头部的SYN设为1,返回服务器端的起始序号ACK(随机),并且返回客户端的ACK+1,表示期望接收下一个数据。客户端收到之后,就把SYN设为0,确认服务器刚刚发送的报文。

四次挥手:


任意一方都可以关闭连接,要把报文报头的FIN字段设为1表示要关闭连接,另一方收到了就发送ACK报文表示确认,然后再发送一个FIN报文(FIN设为1)表示自己要关闭连接了,然后初始方再发送ACK报文表示自己知道对方关闭了。

为什么需要三次握手:

因为如果在第一次请求的时候延时了或者丢包了,后来可能包又发送到了服务器上,服务器就发送SYN报文,开启连接了。然而这时候客户端又不需要这个连接了,会导致服务器的这个连接无响应,浪费资源

为什么需要四次挥手:

在A发送FIN给B后,B表示收到了关闭连接,如果这个时候B的资源还没有传送完成,可以继续发送。发送结束后,像A发送FIN报文,表示自己要关闭连接了。如果只有三次,在最后B发送FIN的时候丢包了,A就不知道B是否关闭了,这样连接就不安全。因此A还要发送一个ACK确认报文确认自己知道了对方要关闭。这样双方都可以关闭连接了。B在等待A最后的ACK报文,如果超时了就重传FIN报文,来保证A知道了B要关闭连接。


0 0
原创粉丝点击