计算机网络:传输控制协议(Transmission Control Protocol-TCP协议

本文主要是介绍计算机网络:传输控制协议(Transmission Control Protocol-TCP协议,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

计算机网络:传输控制协议(Transmission Control Protocol-TCP协议)

  • 本文目的
  • 前置知识点
  • TCP协议简介
  • 主要特性
  • 通信流程
    • 1. 建立连接的过程(三次握手,243)
      • 1.1 为什么要三次握手,两次不行吗?
    • 2. 释放连接的过程(四次挥手,3343)
      • 2.1 TIME-WAIT时间等待状态是做什么的?
  • 参考文献

本文目的

介绍TCP协议的内容,三次握手和四次挥手的必要性和原因

前置知识点

  1. 计算机网络基本知识。

TCP协议简介

全称Transmission Control Protocol,传输控制协议,运输层协议。

主要特性

参考《计算机网络》传输层协议TCP概述p211

  1. 面向连接的运输层协议,传输前需要简历TCP连接
  2. 每一条TCP协议都是点对点通信的
  3. 提供可靠交付的数据,通过TCP连接传输的数据无差错,不丢失,不重复
  4. 全双工通信
  5. 面向字节流

通信流程

1. 建立连接的过程(三次握手,243)

需要阐明为什么每次交互会有这些标志位。

图解如下
在这里插入图片描述

  1. 最开始客户端和服务器都处于关闭状态
  2. 服务器创建传输控制块(TCB,Transmit Control Block),进入绑定自己的ip和端口进入监听(listen)状态
  3. 客户端创建TCB,已知服务器的ip和端口,向服务器发出连接请求报文,包括以下内容:(发送后进入同步已发送SYN_SENT状态
    • SYN(SYNchronization)同步序号置1,表示这是一个连接请求报文
    • seq初始序号x,该报文不携带数据但是需要消耗一个初始序号,也是服务器应答的依据(服务器需要应答x+1这样客户端才知道刚刚那条报文发过去了)
  4. 服务器收到连接请求报文之后,如同意连接,返回确认报文段,包含以下内容:(发送后进入同步收到SYN_RCVD状态
    • SYN同步序号置1,表示这是一个连接接受报文段。
    • seq初始序号y,同样的需要小号一个初始序号,也是客户端应答的依据。
    • 确认ACK = 1,ACK= 1的时候确认号字段(ack)才有效,建立连接后所有的报文段都要把ACK置1。
    • 确认号ack = x + 1,期望对方下一个报文段第一个字节的序号,表示x之前的数据都收到了。
  5. 客户端收到连接确认报文之后,还要再给B发出确认,包含以下内容:(同时客户端已进入连接建立ESTABLISHED状态
    • ACK = 1,seq = x + 1, ack = y + 1。
    • 可以包含数据,如果不包含则不消耗x + 1这个序列号。
  6. 服务器收到之后进入连接建立ESTABLISHED状态,三次握手建立成功。

1.1 为什么要三次握手,两次不行吗?

参考《计算机网络》5.9 TCP的运输连接管理p239

两次握手可以避免已失效的连接请求报文段,客户端发送给服务器但是延迟送达,对于客户端来说早已失效(过期了),而且失效之后客户端没有再重发请求,但是服务器响应并且发回确认报文段,如果两次握手,服务器此时就开始建立连接,而客户端根本不会相应确认报文段,所以没连接,服务器就会干等消耗资源

其他情况理论上都可以被三次握手解决。试图举反例举不出来。

2. 释放连接的过程(四次挥手,3343)

在这里插入图片描述

  1. 最开始客户端和服务器都处于ESTABLISHED状态
  2. 客户端发完要发的消息之后,需要释放连接,发出连接释放报文,包含以下内容:(同时进入终止等待1-FIN-WAIT-1状态
    • FIN = 1,表示是一个连接释放报文
    • seq = u,释放报文需要消耗一个序号。
    • ACK = 1,理由同连接的时候一致。
  3. 服务器收到连接释放报文之后需要立刻应答,表示收到了连接释放报文,包含以下内容:(同时进入关闭等待-CLOSE-WAIT状态
    • ACK = 1
    • ack = u + 1
    • seq = v,需要消耗一个序号
  4. 客户端收到之后进入终止等待2-FIN-WAIT-2状态,可能服务器还有一些消息要发,这个阶段如果服务器发消息,客户端也要接着收。这个时候TCP称之为半关闭状态。
  5. 服务器也发完消息之后,发送连接释放报文,包含以下数据:(同时进入最后确认-LAST-ACK状态
    • FIN = 1,表示释放连接报文
    • seq = w,因为因为可能半关闭期间发了些消息,所以不是v + 1。
    • ack = u + 1不变,因为客户端没发过消息了。
    • ACK = 1。
  6. 客户端收到之后,发送最后确认,包含以下内容:(然后进入时间等待-TIME-WAIT状态
    • ACK = 1
    • ack = w + 1
    • seq = u + 1
  7. 服务器收到之后就可以关闭连接了
  8. 客户端TIME-WAIT结束后也会断开连接。

2.1 TIME-WAIT时间等待状态是做什么的?

参考《计算机网络》5.9.2 TCP的连接释放p240

避免最后一个客户端发出的ACK报文丢失带来的问题。

时间等待计时器TIME-WAIT timer 是2MSL(Maximum Segment Lifetime)最长报文段寿命

  1. 当最后一个报文丢失(超过了MSL)的时候,服务器收不到会卡在最后确认-LAST-WAIT状态,这个时候服务器可能会重新发送连接释放报文,客户端需要保证能收到,才有可能再次发送最后确认的报文。一来一回刚好是两倍的MSL。
  2. 保证本次通信的所有报文都消失(2MSL之后肯定都消失了),防止旧的包干扰下一次连接
    • 个人理解不一定对:假设第一次发了两次连接请求,但是有一个卡在路上了,然后关闭了,然后卡在路上的那个又到服务器了,其实服务器是可以不用理的

参考文献

《计算机网络》传输层协议TCP概述p211
《计算机网络》5.9 TCP的运输连接管理p239
《计算机网络》5.9.2 TCP的连接释放p240

这篇关于计算机网络:传输控制协议(Transmission Control Protocol-TCP协议的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/856785

相关文章

HTTP 与 SpringBoot 参数提交与接收协议方式

《HTTP与SpringBoot参数提交与接收协议方式》HTTP参数提交方式包括URL查询、表单、JSON/XML、路径变量、头部、Cookie、GraphQL、WebSocket和SSE,依据... 目录HTTP 协议支持多种参数提交方式,主要取决于请求方法(Method)和内容类型(Content-Ty

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec

Java整合Protocol Buffers实现高效数据序列化实践

《Java整合ProtocolBuffers实现高效数据序列化实践》ProtocolBuffers是Google开发的一种语言中立、平台中立、可扩展的结构化数据序列化机制,类似于XML但更小、更快... 目录一、Protocol Buffers简介1.1 什么是Protocol Buffers1.2 Pro

Java对接MQTT协议的完整实现示例代码

《Java对接MQTT协议的完整实现示例代码》MQTT是一个基于客户端-服务器的消息发布/订阅传输协议,MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛,:本文主要介绍Ja... 目录前言前置依赖1. MQTT配置类代码解析1.1 MQTT客户端工厂1.2 MQTT消息订阅适配器1.

Linux中的自定义协议+序列反序列化用法

《Linux中的自定义协议+序列反序列化用法》文章探讨网络程序在应用层的实现,涉及TCP协议的数据传输机制、结构化数据的序列化与反序列化方法,以及通过JSON和自定义协议构建网络计算器的思路,强调分层... 目录一,再次理解协议二,序列化和反序列化三,实现网络计算器3.1 日志文件3.2Socket.hpp

Linux中的HTTPS协议原理分析

《Linux中的HTTPS协议原理分析》文章解释了HTTPS的必要性:HTTP明文传输易被篡改和劫持,HTTPS通过非对称加密协商对称密钥、CA证书认证和混合加密机制,有效防范中间人攻击,保障通信安全... 目录一、什么是加密和解密?二、为什么需要加密?三、常见的加密方式3.1 对称加密3.2非对称加密四、

Linux之UDP和TCP报头管理方式

《Linux之UDP和TCP报头管理方式》文章系统讲解了传输层协议UDP与TCP的核心区别:UDP无连接、不可靠,适合实时传输(如视频),通过端口号标识应用;TCP有连接、可靠,通过确认应答、序号、窗... 目录一、关于端口号1.1 端口号的理解1.2 端口号范围的划分1.3 认识知名端口号1.4 一个进程

如何在Spring Boot项目中集成MQTT协议

《如何在SpringBoot项目中集成MQTT协议》本文介绍在SpringBoot中集成MQTT的步骤,包括安装Broker、添加EclipsePaho依赖、配置连接参数、实现消息发布订阅、测试接口... 目录1. 准备工作2. 引入依赖3. 配置MQTT连接4. 创建MQTT配置类5. 实现消息发布与订阅

使用Python进行GRPC和Dubbo协议的高级测试

《使用Python进行GRPC和Dubbo协议的高级测试》GRPC(GoogleRemoteProcedureCall)是一种高性能、开源的远程过程调用(RPC)框架,Dubbo是一种高性能的分布式服... 目录01 GRPC测试安装gRPC编写.proto文件实现服务02 Dubbo测试1. 安装Dubb

SpringBoot快速搭建TCP服务端和客户端全过程

《SpringBoot快速搭建TCP服务端和客户端全过程》:本文主要介绍SpringBoot快速搭建TCP服务端和客户端全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录TCPServerTCPClient总结由于工作需要,研究了SpringBoot搭建TCP通信的过程