TCP 三次握手vsTCP 四次握手
来源:互联网 发布:烟台青少年编程培训 编辑:程序博客网 时间:2024/05/24 05:49
TCP 三次握手
第一次握手:客户端 A 将标志位 SYN 置为 1,随机产生一个值为 seq=J(J 的取值范围为=1234567)的数据包到服务器,客户端 A 进入 SYN_SENT 状态,等待服务端 B 确认;
第二次握手:服务端 B 收到数据包后由标志位 SYN=1 知道客户端 A 请求建立连接,服务四端 B 将标志位 SYN 和 ACK 都置为 1,ack=J+1,随机产生一个值 seq=K,并将该数据包发送给客户端 A 以确认连接请求,服务端 B 进入 SYN_RCVD 状态。
第三次握手:客户端 A 收到确认后,检查 ack 是否为 J+1,ACK 是否为 1,如果正确则将标志位 ACK 置为 1,ack=K+1,并将该数据包发送给服务端 B,服务端 B 检查 ack 是否为K+1,ACK 是否为 1,如果正确则连接建立成功,客户端 A 和服务端 B 进入 ESTABLISHED状态,完成三次握手,随后客户端 A 与服务端 B 之间可以开始传输数据了。
为什需要三次握手?
《计算机网络》第四版中讲“三次握手”的目的是“为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误”书中的例子是这样的,“已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达 server。本来这是一个早已失效的报文段。但 server 收到此失效的连接请求报文段后,就误认为是 client 再次发出的一个新的连接请求。于是就向 client 发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要 server 发出确认,新的连接就建立了。由于现在client 并没有发出建立连接的请求,因此不会理睬 server 的确认,也不会向 server 发送数据。但 server 却以为新的运输连接已经建立,并一直等待 client 发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client 不会向 server 的确认发出确认。server 由于收不到确认,就知道 client 并没有要求建立连接。”。主要目的防止 server 端一直等待,浪费资源。
TCP 四次挥手
第一次挥手:Client 发送一个 FIN,用来关闭 Client 到 Server 的数据传送,Client 进入FIN_WAIT_1 状态。
第二次挥手:Server 收到 FIN 后,发送一个 ACK 给 Client,确认序号为收到序号+1(与SYN 相同,一个 FIN 占用一个序号),Server 进入 CLOSE_WAIT 状态。
第三次挥手:Server 发送一个 FIN,用来关闭 Server 到 Client 的数据传送,Server 进入LAST_ACK 状态。
第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server 进入 CLOSED 状态,完成四次挥手。
为什么建立连接是三次握手,而关闭连接却是四次挥手呢?
这是因为服务端在 LISTEN 状态下,收到建立连接请求的 SYN 报文后,把 ACK 和 SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的 FIN 报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方 ACK 和 FIN 一般都会分开发送。
- TCP 三次握手vsTCP 四次握手
- TCP:三次握手/四次握手
- TCP三次握手/四次握手
- TCP三次握手,四次握手
- tcp 三次握手 四次握手
- TCP三次握手,四次握手
- TCP三次握手四次握手
- TCP三次握手与四次握手
- TCP/IP三次握手与四次握手
- TCP/IP三次握手与四次握手
- TCP三次握手和四次握手
- TCP 三次握手连接&四次握手断开
- TCP三次握手四次握手详解
- TCP三次握手和四次握手
- TCP三次握手与四次握手
- TCP三次握手与四次握手
- TCP三次握手和四次握手
- TCP三次握手与四次握手
- PHP对API传输参数加密头部信息,生成字符串代码。来自百度云API
- 一些关于bootstrap,bagging,Adaboost,random forest, gradient boost的基本理解
- python自学笔记(7)--Python类
- 把GIT导出的项目转换成Maven项目
- Excel在统计分析中的应用—第八章—假设检验-单个正态总体方差的假设检验
- TCP 三次握手vsTCP 四次握手
- react入坑之列表和key(索引)
- React Native入门(十三)之组件的生命周期
- IntelliJ IDEA 学习笔记
- spring配置中<context:annotation-config> 和 <context:component-scan>区别
- dataGrid 删除行
- IndentationError: unindent does not match any outer indentation level
- 滑动变阻器改进AD输入电压(STM32)
- POJ 3292.Semi-prime H-numbers