linux网络通讯3次握手和4次挥手

linux网络通讯3次握手和4次挥手_第1张图片

3次握手

1、大多数情况下,客户端往服务端发送一个数据包,标志位为SYN(表示建立连接),包号为1000(自己定),数据包的大小为0;表示数据大小的上限是1460字节;

2、服务端在收到客户端的数据包之后,表示收到数据包,发送ACK 1001回写给客户端,ACK是标志位,1001 =1000+1 表示收到客户端发送的1000包号 + 一位标志位SYN,总共1001【表示1001以前的数据包都收到了】;然后回写SYN 8000(自己定)给客户端,大小为0(表示建立连接),数据大小的上限为1024;

3、客户端在收到服务端的信息后,回写ACK 8001 ;表示8001以前的数据包都收到了;

这个过程在内核中发生,体现在用户层上为,connect()、accept()这两个函数;

数据通信

1、在下图的4标号那里,先回写ACK 8001,再次表示收到握手完成是收到的8001以前的数据包;同时发送数据包1001大小为20给服务端(1001是在前面握手的客户端发送1000数据包的基础上往上加);

2、服务端回写ACK 1021 表示收到客户端的1021以前的数据包;同时也发送8001数据包大小为10(8001同样是在前面3次握手数据包的名字8000往上加的);

3、客户端回写ACK 8011 表示收到服务端发送的数据包8011(8001+10)以前的数据包。

在这个过程中,并不是发送一条回写一条的,这样效率会收到制约,在滑动窗口的机制上,同时发送好几条数据包,服务端再回写一定的ACK表示都收到前面的数据包了(回写消息表示是否收到前面发送的数据包,是TCP区别与UDP更准确,不丢失数据的原理)。

 

4次挥手

1、大多数情况下由客户端先向服务端发送一个标志位FIN(表示结束连接),数据包例如上图的1021(是在前面通讯使用到了那个数据包的基础上,累加起来的),大小为0;同时回写ACK 8011表示收到了之前8011以前的数据包

2、服务端回写客户端ACK 1022 表示收到1021以前的数据包;

3、服务端向客户端表示我这边也要关闭通信了,发送FIN8011 (0);同时回写ACK 1022 再次表示收到了之前的数据包;

4、客户端向服务端发送ACK 8012 表示我收到了你要关闭通信的消息

关闭时的4次挥手比建立通讯时的3次握手多一个过程的原因是因为:关闭(FIN)是一个半关闭的过程,1、先是客户端先表示我要关闭通信了(关闭套接字中的写缓冲区);2、服务端也要发送消息表示我也要关闭通信了;在握手的过程中不存在半连接这种动作。

你可能感兴趣的:(linux应用编程)