TCP(传输控制协议详解)详解

article/2025/10/11 16:18:34

TCP协议的特点

(1)TCP协议是面向连接的运输层协议

在数据传输前必须建立连接,数据传输之后释放连接。

(2)TCP提供可靠交付的服务

所谓可靠是指在传输过程中无重复,无丢失,无错误。但是同时会增加开销。

(3)每一条连接都是点对点连接(一对一)

(4)面向字节流

所谓字节流指的是以传输过程中流入进程和流出进程的字节序列,虽然传输过程中是一个一个数据报,但这只是为了方便传输,之后在目的端重新装配。

(5)TCP提供全双工通信

所谓全双工是指一端既可以是客户端,也可以是服务器。

       TCP头部有20个固定字节,选项部分长度不定,最多40个字节。

(1)源端口和目的端口:各占2个字节。端口是指传输层和应用层的服务端口。传输层的分用和复用就是通过端口实现的。

分用:在发送端,多个客户端进程公用一个传输层。

复用:在接收端,传输层会根据端口号分配给不同的应用进程。

(2)序号字段:占4个字节。范围是0—2^32-1。因为TCP是面向字节流,所以它为每一个字节进行编号。

(3)确认号:占4个字节,是期望收到下一个报文段的数据部分的第一个序号。

(4)数据偏移:占4个字节。是指TCP报文段的数据开始的部分距TCP报文段起始部分的偏移量。

(5)保留字段:占6个字节。

(6)标识符:

URG:当URG置1时,表示紧急指针有效,它告诉系统此报文段有紧急数据,应尽快传送。

ACK:ACK置1,表示确认号字段才有效。此外,TCP规定,建立连接后,传输的所有报文段的ACK都需要被置1.

PSH:当接收者收到PSH=1时,会立即把数据传输给应用程序,而不会等到缓冲区满了,再做提交。

RST:RST=1,表示TCP连接出现了严重的问题,必须释放重连。

SYN:建立连接的时候使用。

        当SYN=1,ACK=0时,表示为请求连接。

        当SYN=1,ACK=1时,表示为同意连接的请求应答。

FIN:FIN=1,表示请求释放连接。

(7)窗口:占2个字节,表示接受端的接收窗口的大小。用于实现流量控制。将接收端发送过去的窗口大小设置成发送端的发送窗口大小,从而控制了发送端的发送效率。

(8)校验和:用于检测发送过程中是否出现错误。

(9)紧急指针:用于标识紧急数据的尾部。

(10)选项字段:(需要掌握的几个选项)MMS—最大报文长度,实际是报文段的最大数据长度。窗口扩大因子。时间戳选项。

TCP可靠传输技术

TCP提供的可靠传输而使用的方式是序号,确认号,超时重传,滑动窗口等可靠传输机制。

流量控制:

防止发送端发送数据过快,接收端无法接收。

假设A收到B应答的窗口大小为20个字节,确认号字段为31,据悉,A所构造的发送窗口。

A发送11个字节

假设B收到了31号数据,把31—33交付给主机,然后B删除这些数据。A收到新的确认号为34.

A继续发送42-53.A的窗口已经发完但是没有确认,所以停止发送。

持续计时器

为了避免流量控制引发的死锁,TCP使用了持续计时器。当连接的一方收到窗口大小为0,则启动持续计时器,若设置的持续计时器的时间已到,则发送一个窗口探测报文段。如果窗口值还为0,则持续等待,当不为0,则证明报文段丢失,则重新发送,打破死锁。

TCP的三次握手

开始的时候,客户端和服务器端分别创建自己的传输控制块(TCB),创建完后server进入Listen状态,此时准备接受client发送的请求。

第一次握手:客户端向服务器端发送连接请求。

                    SYN=1,ACK=0表示请求连接。

                    X表示本次字节流的初始序号。

                    TCP规定:此时没有数据传输,但是消耗一个序号。

第二次握手:服务器向客户端发生应发响应。

                    SYN=1,ACK=0表示同意连接的应答响应。

                    Y表示本次字节流的初始序号。

                    X+1表示希望收到的字节起始序号。

第三次握手:当客户端收到连接同意的应答后,还要向服务端发送一个确认报文段,表示:服务端发来的连接同意应答已经成功收到。

                    该报文段的头部为:ACK=1,seq=x+1,ack=y+1。

 客户端发完这个报文段后便进入ESTABLISHED状态,服务端收到这个应答后也进入ESTABLISHED状态,此时连接的建立完成!

为什么连接只需要三次握手,而不是两次握手?

当客户端接收到应答响应是,就会进入estabished状态,而服务器端只有收到客户端的连接请求后才会进入estabished状态。

此时如果网络拥塞,客户端发送的连接请求迟迟到不了服务端,客户端便超时重发请求,如果服务端正确接收并确认应答,双方便开始通信,通信结束后释放连接。此时,如果那个失效的连接请求抵达了服务端,由于只有两次握手,服务端收到请求就会进入ESTABLISHED状态,等待发送数据或主动发送数据。但此时的客户端早已进入CLOSED状态,服务端将会一直等待下去,这样浪费服务端连接资源。

TCP四次挥手

第一次挥手:A已经发送完数据,请求释放连接,只发送报文头,此时A进入FIN_WAIT状态。

                    FIN=1,表示释放连接。

                    seq=u,u-1表示确认的最后一个数据序号。

第二次挥手:B收到连接释放请求之后,会告诉它A到B这个方向已经释放。B向A发送应答响应,B进入CLOSE_WAIT状态。

                    ACK=1:除TCP连接请求报文段以外,TCP通信过程中所有数据报的ACK都为1,表示应答。

                    seq= v:v-1是B向A发送的最后一个字节的序号。

                    ack=u+1表示希望收到从第u+1个字节开始的报文段,并且已经成功接收了前u个字节。

第三次挥手:当B向A发完所有数据后,向A发送连接释放请求,请求头:FIN=1,ACK=1,seq=w,ack=u+1。

                    B便进入LAST-ACK状态。

第四次挥手:A收到释放请求后,向B发送确认应答,此时A进入TIME-WAIT状态。

                    该状态会持续2MSL时间,若该时间段内没有B的重发请求的话,就进入CLOSED状态,撤销TCB。当B收到确认应答后,也便进入CLOSED状态,撤销TCB。








http://chatgpt.dhexx.cn/article/dYjX2diF.shtml

相关文章

TCP/IP协议(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)

TCP/IP协议 TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协…

用户数据报协议UDP和传输控制协议TCP

目录 UDP UDP的功能 UDP的特点 UDP的首部格式 TCP TCP的功能 TCP的特点 TCP面向流的概念 套接字(socket) 无连接工作流程和面向连接的工作流程对比 UDP UDP的功能 UDP只在IP的数据报服务上增加了很少一点功能: 1.复用和分用功能 2.差错检测…

TCP(传输控制协议)

TCP 最主要的特点 TCP 是应用程序在使用 TCP 协议之前,必须先建立 TCP 连接。 在传送数据完毕后,必须释放已经建立的 TCP 连接面向连接的运输层协议每一条 TCP 连接只能有两个,每一条 TCP 连接只能是(一对一)点对点TCP 提供的服务。 通过 TCP…

传输层-传输控制协议(TCP)

目录 TCP 协议概述TCP 报文段结构TCP连接管理三次握手四次挥手 TCP 可靠数据传输TCP拥塞控制 TCP 协议概述 传输控制协议(TCP)是Internet传输层协议。提供面向连接、可靠、有序、字节流传输服务。 面向连接:应用程序在使用 TCP 之前&#x…

传输控制协议---TCP协议【详解】

目录 一、协议简介 二、TCP报文格式 1、字段解析 2、报文解析 三、TCP的重传机制 1、超时重传 2、快速重传 3、 SACK 方法 4、Duplicate SACK 四、TCP的滑动窗口机制 五、流量控制 六、拥塞机制 1、慢启动 2、拥塞避免算法 3、拥塞发生 4、快速恢复 七、TCP的三…

传输控制协议(TCP)

可靠的流传输服务 传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。本文介绍TCP把他当成TCP/IP网际协议族的一部分,是一个独立的通信协议。 五个可靠交付特征 1.面向流…

传输控制协议TCP

一、概述 概念:传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP最主要的特点: (1)TCP是面向连接的运输层协议。 (2&a…

[2] SDL的基础知识以及利用SDL播放视频

此博文相关知识点从雷神的博客以及视频学习,截图也是用了他的课件, 雷神博客地址:http://blog.csdn.net/leixiaohua1020/ 日期:2016.10.1 作者:isshe github:github.com/isshe 邮箱:i.ssheoutlook.com …

Start Game:SDL2简介

Start Game:SDL2简介 官网简介: Simple DirectMedia Layer是一个跨平台开发库,旨在通过OpenGL和Direct3D提供对音频、键盘、鼠标、操纵杆和图形硬件的低级别访问。它被视频播放软件、模拟器和流行游戏使用,包括Valve的获奖目录和许…

SDL2的学习之路<三>显示文字

前言 上节介绍了怎么利用SDL接口去显示图片,这节主要介绍怎么去显示文本信息。 SDL2展示文字需要在官网下载SDL2_ttf的扩展库。这个第一节已经讲过了。 使用时需要先初始化库,使用结束时释放库资源。 TTF_Init(); //初始化库 … TTF_Quit(); //释放 显…

VS2019配置SDL2库

“SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台(Linux、Windows、MacOS…

SDL系列教程(一):SDL简介

SDL教程(一) 作者:akinggw 在阔别半年后,我又回来了。这次回来,首先要向大家问声好,然后继续我们的游戏开发之旅。在以前的日子里,我主要在翻译一些游戏开发方面的文章,而现在&…

SDL2源代码分析1:初始化(SDL_Init())

SDL源代码分析系列文章列表: SDL2源代码分析1:初始化(SDL_Init()) SDL2源代码分析2:窗口(SDL_Window) SDL2源代码分析3:渲染器(SDL_Renderer) SDL2源代码…

SDL2入门教程(01_hello_SDL)

注: 本教程翻译自 lazyfoo的教程,原网址戳这里。翻译目的为鼓励自己坚持下去,可能语言不准确,仅供参考。 Hello SDL: 你的第一个图形窗口 这一篇教程包含最主要也最基础的一步——弹出一个窗口(Window) …

SDL2源代码分析2:窗口(SDL_Window)

SDL源代码分析系列文章列表: SDL2源代码分析1:初始化(SDL_Init()) SDL2源代码分析2:窗口(SDL_Window) SDL2源代码分析3:渲染器(SDL_Renderer) SDL2源代码…

SDL2使用简介

转自我的Gitee项目 SDL2使用简介 SDL2使用简介开发环境搭建WindowsVisual StudioCode::BlocksDev-Cpp CMake(CLion)问题总结 SDL2库使用介绍初始化创建窗口绘制矩形刷新屏幕读取输入直接扫描键盘读取系统事件 实例 绘制图片 SDL2使用简介 开发环境搭建 Windows Visual Stud…

SDL2 简明教程(二):创建一个空的窗口

系列文章目录 SDL2 简明教程(一):使用 Cmake 和 Conan 构建 SDL2 编程环境 SDL2 简明教程(二):创建一个空的窗口 文章目录 系列文章目录创建空窗口总结 创建空窗口 在上一篇文章中,我们了解…

强大无比的嵌入式多媒体开发神器:SDL2

SDL 是什么? SDL(Simple DirectMedia Layer)是一套开源的跨平台多媒体开发库,使用 C 语言写成。 它提供了绘制图像、播放声音、获取键盘输入等相关的 API,大大降低多媒体应用开发难度的同时,也让开发者只要…

SDL2 简明教程(五):OpenGL 绘制

系列文章目录 SDL2 简明教程(一):使用 Cmake 和 Conan 构建 SDL2 编程环境 SDL2 简明教程(二):创建一个空的窗口 SDL2 简明教程(三):显示图片 SDL2 简明教程&#xf…

SDL —— SDL2及API简介

SDL2框架 SDL( Simple DirectMedia Layer) 是一套开放源代码的跨平台多媒体开发库, 使用 C 语 言写成。 SDL 提供了数种控制图像、 声音、 输出入的函数, 让开发者只要用相同或是相似的 代码就可以开发出跨多个平台( L…