小说网站的会员充值是怎么做的,做垂直网站,wordpress 替换字体,公司做网站需要准备哪些资料三次握手与四次挥手 通过TCP/IP协议的学习#xff0c;我们可以知道TCP协议是一种面向连接的、可靠的传输协议。其中#xff0c;为了保证客户端与服务器连接的有效性#xff0c;就有了本篇文章所要介绍的“三次挥手”#xff1b;而“四次挥手”则是为了保证连接的正确断开。…三次握手与四次挥手
通过TCP/IP协议的学习我们可以知道TCP协议是一种面向连接的、可靠的传输协议。其中为了保证客户端与服务器连接的有效性就有了本篇文章所要介绍的“三次挥手”而“四次挥手”则是为了保证连接的正确断开。
1. TCP状态
首先介绍一下TCP的几个状态
SYN —— 同步序列编号在建立连接时发送ACK —— 确认信息在确认SYN信息时发送响应信息FIN —— 关闭连接RST —— 连接重置PSH —— 有数据传输URG —— 紧急指针字段值有效
2. 三次握手
建立TCP连接时会经过如下步骤
服务器准备接收客户端连接通过socket API由于连接是由客户端激发的因此称为被动打开客户端调用connect开始主动打开并发送SYNsyn i包告诉服务器发送数据的序列号服务器确认ACK,ack i1客户端发来的信息SYN并发送SYN(syn j)其中含有服务器发送数据的初始序列号。注SYN和ACK是同时发送的在一个数据包中客户端确认服务器发送的SYN发送ACK(ack j1)数据包
其中因为SYN需要占据一个字节的序列号空间因此ACK中确认号为发来的SYN序列号加1类似FIN的ACK确认号为该FIN序列号加1。 3. 四次挥手
某进程先调用close该端TCP发送FIN(fin i)表示数据发送完毕需要关闭连接。称为主动关闭接收到FIN的对端执行被动关闭。进行确认ACK, ack i1在该进程接收的其他所有数据之后添加文件结束符end-of-file一段时间之后因为要处理已经接收到的数据接收到文件结束符的进程调用close关闭套接字这导致它的TCP也发送FIN(fin j)主动关闭连接的一端确认(ACK, ack j1)最后发送的FIN 为什么建立连接要三次握手而断开连接要四次挥手
建立连接时因为发起连接的一端在发出请求后连接建立之前就不会再发出任何数据因此接收连接请求的对端可以将ACK、SYN放在一个数据包里发回给请求端即需要三次数据发送。而断开连接时在一端主动断开连接并发送FIN包后对端接收到发来的FIN包进行确认ACK然而此时服务器可能还在给另一端发送数据只有在数据发送完后才能断开连接发送FIN包所以不能像三次握手时那样将ACK、SYN同时发送另一端收到FIN后再进行确认并发送ACK因此需要四次数据发送。
TCP建立的连接为全双工通道可以双向传输数据因此在建立连接、断开连接时需要两端都要进行请求与确认。
为什么建立连接的ACK、SYN可以同时发送而断开连接则需要分开发送
建立、断开连接都需要两次请求与确认只是建立连接时SYN、ACK可以同时发回而在断开连接时由于被动关闭的一端可能还会发送数据只有数据发完后才能发送ACK所以只能分开发送也就造成了建立连接为三次断开连接反而成了四次。建立连接时由于握手期间连接未完全建立故不能发送其他数据 简单说由于分组交换机制由A发给B的数据所经过的链路可能与B返回给A的数据所经过的链路不同因此即便在B接收到A的数据并返回给A应答后仅能保证A--B的链路是通的却不能保证A一定可以接收到B的应答因此需要A再给B一个应答来确保链路两端都收到了相应的数据。