第四阶段C#通讯开发-5:TCP

1_TCP概述

TCP(Transmission Control Protocol)传输控制协议。它是七层框架中的【传输层】中的协议。是TCP/IP协议簇中的一个重要协议。 TCP是一种【面向连接的】、【可靠的】、基于【字节流】的【传输层通信协议】

TCP/IP协议簇:组,此组上包含传输层和网络层上的协议。 TCP/IP协议簇是Internet的基础,也是当今最流行的组网形式。TCP/IP是一组协议的代名词,包括许多别的协议,组成了TCP/IP协议簇。 其中比较重要的有IP协议、TCP协议、UDP协议、FTP协议、DNS协议、SMTP协议等

2_TCP特点

TCP具有【有序的】,【安全的】,【可靠的】,【不容易丢包】,【延时性高】等特点

3_TCP主要应用场景

主要用于聊天,数据传输。

4_三次握手

(1)三次握手的过程:

  • 第一次握手:客户端向服务器发起连接请求。请求建立连接。为了请求 SYN=1和seq=100

  • 第二次握手:服务端收到客户端发过来的请求后,响应给客户端一个结果(回复一段报文)。为了确认 SYN=1, ACK=1, seq=300, ack=101 这次服务器告诉客户端我收到你的请求了。

  • 第三次握手:客户端收到服务器端响应后,在响应的数据后,再向服务器发一段报文。为了确认 ACK=1,seq=101,ack=301,这次客户端告诉服务器我收到你的响应了。

(2)三次握手之后,客户端和服务器之间可以通讯。通讯结束后,进行四次挥手。

三次握手:换句话说,让客户端和服务器能通讯之前,双方建立一个信任通道,通过三次握手建立的。

(3)三次握手即客户端和服务器双方发送了三次数据报文。其中客户端发两次,服务器响应一次。

(4)SYN是一个标识,标识客户端想干啥?想连接SYN=1,想请求数据SYN=2,想释放连接SYN=3

ACK是一个标识,标识服务器是否已经收到客户端的请求报文?ACK=1且ack=客户端seq+1表示服务器已收到客户端请求报文 在服务器响应的报文中,如果带有客户端发送的SYN=1,表示服务器允许客户端请求。

详情请看: https://baijiahao.baidu.com/s?id=1709872840052170461 https://baijiahao.baidu.com/s?id=1708621911214426696

延申问题:TCP为什么在三次握手?两次握手不行吗? 因为需要考虑连接时丢包的问题,如果没有第三次握手,客户端一直没得到服务器端的回应。客户端就不会再次请求服务器。

5_四次挥手

第一次挥手:客户端数据传输完成后,向服务器发送一段FIN报文(连接释放报文)。

第二次挥手:服务端收到客户端发的FIN报文后给客户端回复确认报文。

第三次挥手:服务端将最后数据发送完毕后,就向客户端发出FIN报文(连接释放报文)。

第四次挥手:客户端收到服务端发的FIN报文后,向服务端发出确认报文。

三次握手的目的是建立一个连接。 四次挥手的目的是关闭一个连接。

6_TCP连接三个阶段?

一个TCP连接通常分为三个阶段:连接(三次握手)、数据传输、退出(四次挥手,即关闭,释放)

7_TCP连接组成部分?

一个TCP连接由一个4元组构成,分别是两个IP地址和两个端口号。

服务器的身份:IP地址和端口 客户端的身份:IP地址和端口

8_TCP报文的头部结构? 数据格式(消息格式)

https://zhuanlan.zhihu.com/p/471415273

TCP报文有32字节。其中20个字节的固定首部。

源端口和目的端口:各占2个字节,这两个值加上IP首部中的源端IP地址和目的端IP地址唯一确定一个TCP连接。有时一个IP地址和一个端口号也称为socket(插口)。

序号(seq):占4个字节,是本报文段所发送的数据项目组第一个字节的序号。在TCP传送的数据流中,每一个字节都有一个序号。 例如,一报文段的序号为300,而且数据共100字节,则下一个报文段的序号就是400;序号是32bit的无符号数,序号到达2^32-1后从0开始。

确认序号(ack):占4字节,是期望收到对方下次发送的数据的第一个字节的序号,也就是期望收到的下一个报文段的首部中的序号;确认序号应该是上次已成功收到数据字节序号+1。只有ACK标志为1时,确认序号才有效。

数据偏移:占4比特,表示数据开始的地方离TCP段的起始处有多远。实际上就是TCP段首部的长度。由于首部长度不固定,因此数据偏移字段是必要的。数据偏移以32位为长度单位,也就是4个字节,因此TCP首部的最大长度是60个字节。即偏移最大为15个长度单位=1532位=154字节。

保留:6比特,供以后应用,现在置为0。

6个标志位比特包括:

  • ACK:只有当ACK=1时,确认序号字段才有效;

  • PSH:当PSH=1时,接收方应该尽快将本报文段立即传送给其应用层。

  • RST:当RST=1时,表示出现连接错误,必须释放连接,然后再重建传输连接。复位比特还用来拒绝一个不法的报文段或拒绝打开一个连接;

  • SYN:SYN=1,ACK=0时表示请求建立一个连接,携带SYN标志的TCP报文段为同步报文段;

  • FIN:发端完成发送任务。

窗口:

TCP通过滑动窗口的概念来进行流量控制。设想在发送端发送数据的速度很快而接收端接收速度却很慢的情况下,为了保证数据不丢失,显然需要进行流量控制, 协调好 通信双方的工作节奏。所谓滑动窗口,可以理解成接收端所能提供的缓冲区大小。TCP利用一个滑动的窗口来告诉发送端对它所发送的数据能提供多大的缓 冲区。窗口大小为 字节数起始于确认序号字段指明的值(这个值是接收端正期望接收的字节)。窗口大小是一个16bit字段,因而窗口大小最大为65535字节。

检验和:

检验和覆盖了整个TCP报文段:TCP首部和数据。这是一个强制性的字段,一定是由发端计算和存储,并由收端进行验证。

相关推荐
以明志、16 小时前
并行与并发
前端·数据库·c#
世洋Blog16 小时前
Unity开发微信小游戏-合理的规划使用YooAsset
unity·c#·微信小游戏
橘子真甜~17 小时前
C/C++ Linux网络编程8 - epoll + ET Reactor TCP服务器
linux·服务器·网络
贝塔实验室17 小时前
红外编解码彻底解析
网络·嵌入式硬件·信息与通信·信号处理·代码规范·基带工程·精益工程
就叫飞六吧17 小时前
“电子公章”:U盾(U-Key)实现身份认证、财务支付思路
网络·笔记
悠悠1213817 小时前
NLB WebSocket 连接问题排查与解决方案
websocket·网络协议·php
wanderist.17 小时前
Linux使用经验——离线运行python脚本
linux·网络·python
郭庆汝18 小时前
(七)自然语言处理笔记——Ai医生
人工智能·笔记·自然语言处理
czhc114007566318 小时前
Winform笔记1129 checkbox listbox combabox checkedlistbox datapacker
笔记
biter008818 小时前
Ubuntu 22.04 有线网络时好时坏?最终解决方案
linux·网络·ubuntu