当前位置: 首页 > news >正文

计算机网络:传输控制协议(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

相关文章:

  • Elasticsearch相关问题
  • 【计算机网络】IP 协议
  • mac m1安装和使用nvm的问题
  • leetcode56--合并数组
  • Maven学习记录
  • 根据疾病名生成病例prompt
  • centos7 如何安装UI
  • 《QT实用小工具·一》电池电量组件
  • Windows 最佳文件管理器:快速、简单、直观、自由 | 开源日报 No.175
  • x86架构中的寄存器和常用指令
  • FlinkSQL之Flink SQL Join二三事
  • <el-table>设置一列为固定字段,其他列为循环生成
  • 星光/宝骏/缤果/长安 车机CarPlay手机操作破解教程V2.0版本(无需笔记本、无需笔记本、无需笔记本)
  • 各大pdf转word软件都用的哪家的ocr引擎?
  • 详解IOS的Automatically Sign在设备上打包
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • javascript数组去重/查找/插入/删除
  • JS函数式编程 数组部分风格 ES6版
  • Python - 闭包Closure
  • Python socket服务器端、客户端传送信息
  • SpiderData 2019年2月23日 DApp数据排行榜
  • SwizzleMethod 黑魔法
  • Vue2 SSR 的优化之旅
  • Vue官网教程学习过程中值得记录的一些事情
  • webpack+react项目初体验——记录我的webpack环境配置
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 温故知新之javascript面向对象
  • 因为阿里,他们成了“杭漂”
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (转)编辑寄语:因为爱心,所以美丽
  • (转)详解PHP处理密码的几种方式
  • (转)原始图像数据和PDF中的图像数据
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .Net FrameWork总结
  • .net 简单实现MD5
  • .net/c# memcached 获取所有缓存键(keys)
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .net中应用SQL缓存(实例使用)
  • @media screen 针对不同移动设备
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...
  • [20150904]exp slow.txt
  • [acwing周赛复盘] 第 94 场周赛20230311