tcp client和tcp server的区别

tcp client和tcp server的区别,第1张

1、TCP和UDP都属于socket通信协议,前者是以100个数据流的方式进行通信,后者是以数据包的方式进行通信。

2、TCP是有向连接协议,UDP是无向连接协议。

3、当tcpclient和服务器建立连接时,它们需要三个握手协议。UDP不需要握手,直接发送数据包。

4、TCP通信不会丢失数据,UDP通信会丢失数据包。

5、在通信可靠性方面,TCP比UDP更可靠。

6、安全性上,TCP安全保密要比UDP高。

7、TServerSocket/TClientSocket,是兼容的消息通知的非阻塞异步模式。

扩展资料:

在使用TCP通讯建立连接时采用客户端服务器模式,这种模式又常常被称为主从式架构,简称为C/S结构,属于一种网络通讯架构,将通讯的双方以客户端(Client )与服务器 (Server) 的身份区分开来。

使用C/S结构的通信常见的还有S7通信, ISO-on-TCP通信。

服务器的特征:被动角色,等待来自客户端的连接请求,处理请求并回传结果。

客户端的特征:主动角色,发送连接请求,等待服务器的响应。

TCP/IP是一个四层的体系结构,它包括应用层,运输层,网际层和网络接口层
IP地址类型
最初设计互联网络时,为了便于寻址以及层次化构造网络,每个IP地址包括两个标识码(ID),即网络ID和主机ID。同一个物理网络上的所有主机都使用同一个网络ID,网络上的一个主机(包括网络上工作站,服务器和路由器等)有一个主机ID与其对应。IP地址根据网络ID的不同分为5种类型,A类地址、B类地址、C类地址、D类地址和E类地址。
1.
A类IP地址
一个A类IP地址由1字节的网络地址和3字节主机地址组成,网络地址的最高位必须是“0”,
地址范围从1000
到126000。可用的A类网络有126个,每个网络能容纳1亿多个主机。
2.
B类IP地址
一个B类IP地址由2个字节的网络地址和2个字节的主机地址组成,网络地址的最高位必须是“10”,地址范围从128000到191255255255。可用的B类网络有16382个,每个网络能容纳6万多个主机

3.
C类IP地址
一个C类IP地址由3字节的网络地址和1字节的主机地址组成,网络地址的最高位必须是“110”。范围从192000到223255255255。C类网络可达209万余个,每个网络能容纳254个主机。
4.
D类地址用于多点广播(Multicast)。
D类IP地址第一个字节以“lll0”开始,它是一个专门保留的地址。它并不指向特定的网络,目前这一类地址被用在多点广播(Multicast)中。多点广播地址用来一次寻址一组计算机,它标识共享同一协议的一组计算机。
5.
E类IP地址
以“llll0”开始,为将来使用保留。
全零(“0.0.0.0”)地址对应于当前主机。全“1”的IP地址(“255.255.255.255”)是当前子网的广播地址。
在IP地址3种主要类型里,各保留了3个区域作为私有地址,其地址范围如下:
A类地址:10000~10255255255
B类地址:1721600~17231255255
C类地址:19216800~192168255255

TCP/IP是用于计算机通信的一组协议,我们通常称它为TCP/IP协议族。它是70年代中期美国国防部为其ARPANET广域网开发的网络体系结构和协议标准,以它为基础组建的INTERNET是目前国际上规模最大的计算机网络,正因为INTERNET的广泛使用,使得TCP/IP成了事实上的标准。之所以说TCP/IP是一个协议族,是因为TCP/IP协议包括TCP、IP、UDP、ICMP、RIP、TELNETFTP、SMTP、ARP、TFTP等许多协议,这些协议一起称为TCP/IP协议。以下我们对协议族中一些常用协议英文名称和用途作一介绍:
TCP(Transport Control Protocol)传输控制协议
IP(Internetworking Protocol)网间网协议
UDP(User Datagram Protocol)用户数据报协议
ICMP(Internet Control Message Protocol)互联网控制信息协议
SMTP(Simple Mail Transfer Protocol)简单邮件传输协议
SNMP(Simple Network manage Protocol)简单网络管理协议
FTP(File Transfer Protocol)文件传输协议
ARP(Address Resolation Protocol)地址解析协议
从协议分层模型方面来讲,TCP/IP由四个层次组成:网络接口层、网间网层、传输层、应用层。其中:
网络接口层 这是TCP/IP软件的最低层,负责接收IP数据报并通过网络发送之,或者从网络上接收物理帧,抽出IP数据报,交给IP层。
网间网层 负责相邻计算机之间的通信。其功能包括三方面。一、处理来自传输层的分组发送请求,收到请求后,将分组装入IP数据报,填充报头,选择去往信宿机的路径,然后将数据报发往适当的网络接口。二、处理输入数据报:首先检查其合法性,然后进行寻径——假如该数据报已到达信宿机,则去掉报头,将剩下部分交给适当的传输协议;假如该数据报尚未到达信宿,则转发该数据报。三、处理路径、流控、拥塞等问题。
传输层 提供应用程序间的通信。其功能包括:一、格式化信息流;二、提供可靠传输。为实现后者,传输层协议规定接收端必须发回确认,并且假如分组丢失,必须重新发送。
应用层 向用户提供一组常用的应用程序,比如电子邮件、文件传输访问、远程登录等。远程登录TELNET使用TELNET协议提供在网络其它主机上注册的接口。TELNET会话提供了基于字符的虚拟终端。文件传输访问FTP使用FTP协议来提供网络内机器间的文件拷贝功能

回答:yangyang
学弟
1月9日 16:16 CMI:技术的核心
正如您从我的上一篇文章(以及所有出版物)中所了解到的,Windows XP Embedded 使用基于 SQL 的数据库来存储所有组件。数据库可以是本地或远程的 Microsoft® SQL Server,也可以是本地的 Microsoft® 数据引擎 (MSDE)(可在 Windows XP Embedded CD 上找到)。而 Windows NT Embedded 40 则使用一个单一的本地 Jet 数据库 mdb 文件来存储所有的组件和配置。
为了能够从一组工具中无缝访问本地和远程数据库,同时提供快捷的数据库切换,整个体系结构中设置了一个数据库通信层。该层称为 CMI,或组件管理接口。它的主要目的是在 Windows XP Embedded 工具(Target Designer、Component Designer 和 Component Database Manager)和组件数据库之间提供一个标准接口,而不管数据库驻留在哪里(本地或远程、SQL Server 或 MSDE)。只要与组件数据库中的内容有关,CMI 就会被调用。
因为所有工具都依赖于活动的数据库连接来进行工作,所以任何工具所做的第一件事都是请求 CMI 提供一个活动数据库连接。如果没有可用的数据库连接,CMI 将返回一个失败,而工具将报告一个错误。总之,没有数据库连接,Windows XP Embedded 将不能进行任何工作。
CMI 也支持某种级别的异步数据库访问,这种情况通常发生在远程 SQL Server 数据库和多个客户端之间。所有涉及数据库更改的 *** 作都在 SQL 中处理,并在 *** 作失败时提供复原功能。CMI 还可以区分只读模式和独占模式。任何工具要从数据库中删除信息(当前仅限于组件数据库管理器),都必须具有独占访问权限,如果任何其他工具打开了数据库,该工具将不能获得这一权限。另一方面,如果某工具已经被授予独占访问权限,其他工具将不能访问数据库,直到该工具释放这一权限。
此对象非彼对象
注意:下面的讨论中将使用两个术语 - 组件和实例,二者很容易混淆。简单地说,组件只是一组驻留在数据库中的资源和属性。组件添加到配置中便称为实例,可以修改、处理和构建。可以把组件视为 cookie 模式,而实例是从该模式中创建的实际 cookie。更改 cookie 剪裁模式并不容易,但在剪裁 cookie 后,可以随意对 cookie 进行处理。了解组件和实例之间的这种差异很重要,在本文和以后的文章中都将涉及这一问题。
因为 CMI 是工具的 COM 服务器,这使得 Windows XP Embedded 体系结构形成这样一个基本特性 - 把任何事物都视为对象。配置、组件、实例、资源、文件、注册项、存储库都是 CMI 覆盖下的对象。因此,Windows XP Embedded 体系结构体现了面向对象 (OO) 思想的三个原则:封装、继承和多态。这里我们不对 OO 设计做详细讨论,只解释其中与 Windows XP Embedded 体系结构有关的几个方面。讨论的重点将集中在组件上,但相关的概念可以扩展到所有 Windows XP Embedded 对象。
每个 Windows XP Embedded 对象都是一个独立的单元。组件带有自己的属性和内部代码,以此来封装自己,并与其他对象区分开来。
组件也能够继承其他组件的属性。例如,假定一组设备都基于同一芯片组:假设为声卡驱动器,使用虚构的 SoundExplosion 1A 芯片组。有三个声卡使用该芯片组,但提供不同的功能:一个用于游戏端口,一个用于 MIDI 端口,另一个用于 SCSI 接口。我们不用创建三个大同小异的组件来适应不同的要求,而只需创建一个组件,将基本功能封装进去。然后针对三种差异创建三个组件,并将基本功能组件列为“原型”。这三个组件将继承与原型相关联的属性和资源,但同时也添加了自己的资源。
Windows XP Embedded 对象中的多态通常由 DHTML 配置脚本和构建脚本来处理。DHTML 配置脚本允许组件的最终用户在组件实例中动态设置属性,然后在构建脚本中检查这些属性并对其做出反应。这样,您就可以在构建配置时更改组件的行为,以满足开发人员的需求。
这最后一部分会进一步体现 CMI 面向对象的特性:Windows XP Embedded 中的每个对象都具有一组属性和方法,某些对象甚至能够对事件做出反应。属性可以分为标准属性(如组件名称、组件作者和版权)和高级属性(cmiNoHelpFiles 是组件的一个常用高级属性)。对象的方法可以简单地继承自基本组件(如基本构建行为),也可以是该组件所特有的(如用户接口核心组件,它包含 DHTML 配置脚本以及构建脚本,可以实现不同的 UI 功能)。可以在构建过程中引发事件,并可由组件脚本做出反应。
某些高级属性已经被预定义,组件最常见的高级属性有 cmiNoHelpFiles(构建脚本用它从构建中删除帮助文件)、cmiLangEnableMUI(构建脚本用它来启用组件的多语言用户接口 [MUI] 支持)以及 cmiProtPropList(Target Designer 用它来保护预定义的属性)。要检查组件的高级属性,可以在 Target Designer 中将组件添加到某个配置,然后在 Configuration Editor 中单击该组件,再单击 Advanced。
扩展对象模型
Windows XP Embedded 的对象特性和 CMI 应用不仅限于组件和实例,CMI 也把配置当作对象处理。配置的标准属性包括配置名称、所有者、作者和版权。高级配置属性包括有关目标启动驱动器、启动 ARC 路径和帮助文件的设置。要检查这些属性,可以在 Target Designer 的 Configuration Editor 中选择配置名称,然后在 Details 窗格中单击 Advanced。
与组件和实例的对象身份一样,它们的组成部分也都被视为对象。组件中的每个文件、注册表或其他资源都是对象,分别具有一组属性。要检查这些属性,可以在 Configuration Editor 中展开实例,然后选择 Files、Registry Data 或 Resources。在 Details 窗格中右击所要检查的资源,这时便会显示该资源的标准属性,同时显示 Advanced 按钮,单击该按钮可以显示资源的高级属性。这同样适用于与该配置相关联的 Extra Files、Extra Registry Data 和 Extra Resources。要完成所有内容,每一个组、包、存储库和存储库集也都被作为对象处理,它们都有自己的标准属性和高级属性。
CMI 的运作
假设我们有一个应用程序要包含到一个运行时映像中。一般的过程是先为应用程序创建一个组件,将组件导入数据库,将组件包含在某个配置中,然后构建运行时映像。现在我们看一下 CMI 在其中的作用。(由于要在接下来的两篇文章中详细探讨组件的创建,因此这里只做一个简单的介绍。)
当启动 Component Designer 时,CMI 首先确保具有一个数据库连接。如果创建新组件,CMI 将创建一个新的组件对象,然后 Component Designer 使用该对象作为所定义的所有组件信息的存储位置。基本的创建过程包括定义组件的名称、指定要复制的文件和将其放在运行时映像中的位置,以及指定使用哪个注册表主键并将其放在何处。名称是组件的标准属性,因此它包含在组件对象中。所指定的文件和注册项是 CMI 创建的对象,它们将附加到组件对象中。
导入组件时,先启动组件数据库管理器。数据库管理器首先调用 CMI 来连接安装时指定的数据库,如果 CMI 连接成功,则可以将 SLD 导入到该数据库。(SLD 表示资源级别定义,并称为“滑动”。由 Component Designer 输出。)组件数据库管理器再将 SLD 传递到 CMI,以便进行处理。浏览数据库、删除包和组件以及检查对象的属性都由 CMI 处理,CDM 的作用相当于基本 COM 对象层的 UI。
当最终准备构建运行时映像时,CMI 将再次验证数据库连接。(是否看到了一个模式?)创建新的配置需要由 CMI 来创建相应的对象,完成整个组件浏览器的内容也是如此。要将组件添加到配置,CMI 首先要基于选定的组件创建一个实例,然后将其附加到打开的配置中。同时也要为该实例的文件、注册表和其他资源创建资源对象。在相关性检查过程中,CMI 将负责标识相关性,并创建相关性解析所需的组件列表。在构建过程中,将调用 CMI 来访问要复制的实际文件,同时提供详细的属性信息来处理相应的构建。

现在游戏开发最火的就是unity了,可以去优就业学习

根据游戏类型的不同,所学的软件也不一样。

中小型游戏大致可分为网页游戏,flash游戏,小游戏等,基本上都是一些休闲类的傻呆萌的情节和 *** 作。

这类游戏开发相对比较简单,会Javascript、HTML、flashcs、Java就可以进行开发了,语言类主要有C/C++,汇编语言,着色器语言,脚本语言,高效的开发语言C#或Java。

现在的游戏主要分为三种:

1、PC类端游(就是电脑上面运行的游戏)

这类游戏在线人数多,游戏中要处理的数据庞大。所以对服务器性能要求非常高,一般都是采用C++做为开发语言,C++可以直接 *** 作内存数据,与 *** 作系统直接交互,减少数据之间的复制,它运行效率高,处理速度快,是很适合这里游戏开发语言。

学习这种游戏的开发,学习的有C++编程,Linux网络编程、TCP/IP通讯协议、多线程编程再加数据库。

PC类端游戏开发周期较长。大概需要三年左右的时间。

2、网页游戏(比如现在经常说的1刀999级)

因为是网页游戏,游戏的界面展示依赖于网络传输,所在在画面和特效上会次于客户端游戏很多。和端游类是差不多是一样的,有些公司之前是做端游的,他们就直接把端游的服务器架构拿来就可以使用,以完成快速开发。

需要学习内容和端游差不多。

3、手机游戏(主要区分为安卓和IOS)

TCP:传输、 控制 、协议。

TCP与UDP最大却别就在那个 C 上面,它充分实现了数据传输时各种控制功能。可以进行丢包 重发控制 ,还可以对次序乱掉的数据包进行 顺序控制 ,还能 控制传输流量 ,这些是UDP中没有的。即T C P 提供一种面向连接的、可靠的字节流服务。

TCP是一中面向有链接的协议,只有在确认对端存在的时候,才会发送分数据,从而也可以控制通信流量的浪费。

什么是可靠的传输: 不丢包、不损坏、不乱序、不重复。

TCP通过 校验和 序列号 确认应答 重发控制 连接管理 以及 窗口控制 等机制来实现可靠传输。

接收端查询就收数据TCP首部中的序号和数据长度。将自己下一步应该接受的序列号作为确认应答返送回去。就这样,通过序列号和确认应答,TCP实现可靠传输。

一般使用TCP首部用于控制的字段来管理连接。一个连接的建立和断开,正常过程中,至少需要来回共7个包才能完成。

TCP首部的数据结构如图所示:

TCP包首部

为了便于理解,忽略选项部分,固定首部通常为20个字节,将按作用分类分析。

前4个字节 来标识了发送方的端口号和接收方的端口号,即该数据包由谁发送,由谁接收。前2个字节标识源端口号,紧接着2个字节标识目的端口号。

即发送方:(11111111,1111111) 2 = (65535) 10 ,除去0~1023

即接收方:(11111111,1111111) 2 = (65535) 10 ,除去0~1023

TCP是面向字节流的。 在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。整个要传送的字节流的起始序号必须在连接建立时设置。首部中的序号字段值则是指的是本报文段所发送的数据的第一个字节的序号。长度为4字节,序号是32bit的无符号数,序号到达2 32 - 1后又从0开始。

ack :确认序号, <u style="box-sizing: border-box;">即确认字节的序号</u> ,更确切地说,是 发送确认的一端 所期望收到的下一个序号。

所谓的 发送确认的一端 就是将确认信息发出的一端。比如第二次握手的 S 端就是 发送确认的一端

确认序号为上次接收的最后一个字节序号加1只有确认标志位( ACK )为1的时候,确认序号才有效。

也叫首部长度,占4个bit,它指出TCP报文段的 数据 起始处距离TCP报文段的起始处有多远。

TCP报文结构

由于首部中还有长度不确定的选项字段,因此数据偏移字段是必要的。

“首部长度”是4位二进制数,单位是 32位字 ,能表示的最大十进制数字是15。

(1111) 2 =(15) 10 ,即是15个32位,一个32位是4个字节,因此数据偏移的最大值是15 4=60个字节,这也是TCP首部的最大字节。因为固定首部的存在,数据偏移的值最小为 20个字节 ,因此选项长度不能超过 40字节 (减去20个字节的固定首部)。

占6位,保留为今后使用,但目前应置为0。

当URG=1时,表明紧急指针字段有效。

它告诉系统此报文段中有紧急数据,应尽快发送(相当于高优先级的数据),而不要按原来的排队顺序来传送。

例如,已经发送了很长的一个程序要在远地的主机上运行。但后来发现了一些问题,需要取消该程序的运行,因此用户从键盘发出中断命令。如果不使用紧急数据,那么这两个字符将存储在接收TCP的缓存末尾。只有在所有的数据被处理完毕后这两个字符才被交付接收方的应用进程。这样做就浪费了很多时间。

当URG置为1时,应用进程就告诉TCP有紧急数据要传送。于是TCP就把紧急数据插入到本报文段数据的最前面,而在紧急数据后面的数据仍然是普通数据。这时要与首部中 紧急指针 (Urgent Pointer)字段配合使用。

仅当ACK = 1时确认号字段才有效,当ACK = 0时确认号无效。TCP规定,在连接建立后所有的传送的报文段都必须把ACK置为1。

当两个应用进程进行交互式的通信时,有时在一端的应用进程希望在键入一个命令后立即就能收到对方的响应。在这种情况下,TCP就可以使用推送(push) *** 作。发送方TCP把PSH置为1,并立即创建一个报文段发送出去。接收方TCP收到PSH=1的报文段,就尽快地(即“推送”向前)交付接收应用进程。而不用再等到整个缓存都填满了后再向上交付。

当RST=1时,表明TCP连接中出现了严重错误(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立传输连接。RST置为1还用来拒绝一个非法的报文段或拒绝打开一个连接。

在连接建立时用来同步序号。当 SYN=1 ACK=0 时,表明这是一个 连接请求报文段 。对方若同意建立连接,则应在响应的报文段中使SYN=1和ACK=1。

因此 SYN=1 就表示这是一个连接请求或连接接受报文。

用来释放一个连接。当FIN=1时,表明此报文段的发送发的数据已发送完毕,并要求释放运输连接。

占2字节。窗口值是(0,2 16 -1)之间的整数。

窗口指的是发送本报文段的一方的接受窗口(而不是自己的发送窗口),窗口大小是给对方用的。

窗口值告诉对方:从本报文段首部中的确认号算起,接收方目前允许对方一次发送的数据量(以字节为单位)。

之所以要有这个限制,是因为接收方的数据缓存空间是有限的。

总之,窗口值作为接收方让发送方设置其发送窗口的依据。

例如,A发送了一个报文段,其确认号是3000,窗口字段是1000这就是告诉对方B:“从3000算起,A接收缓存空间还可接受1000个字节数据,字节序号是3000-3999”,可以想象到河道的阀门。

总之:窗口字段明确指出了现在允许对方发送的数据量。窗口值经常在动态变化。

占2字节。检验和字段检验的范围包括首部和数据这两部分。和UDP用户数据报一样,在计算检验和时,要在TCP报文段的前面加上12字节的伪首部。伪首部的格式和UDP用户数据报的伪首部一样。但应把伪首部第4个字段中的17改为6(TCP的协议号是6);把第5字段中的UDP中的长度改为TCP长度。接收方收到此报文段后,仍要加上这个伪首部来计算检验和。若使用TPv6,则相应的伪首部也要改变。

占2字节。紧急指针仅在URG=1时才有意义,它指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据) 。因此,在紧急指针指出了紧急数据的末尾在报文段中的位置。当所有紧急数据都处理完时,TCP就告诉应用程序恢复到正常 *** 作。值得注意的是,即使窗口为0时也可以发送紧急数据。

长度可变,最长可达40个字节。当没有使用“选项”时,TCP的首部长度是20字节。

最大报文段长度(MSS:Maximum Segment Size)表示TCP传往另一端的最大块数据的长度。当一个连接建立时,连接的双方都要通告各自的MSS。

当建立一个连接时,每一方都有用于通告它期望接收的MSS选项(MSS选项只能出现在SYN报文段中),如果一方不接收来自另一方的MSS值,则MSS就定为默认值536字节(这个默认值允许20字节的IP首部和20字节的TCP首部以适合576字节IP数据报) 。

为什么要规定一个最大报文长度MSS呢?

这并不是考虑接受方的接收缓存可能存放不下TCP报文段中的数据。实际上,MSS与接收窗口值没有关系。

我们知道,TCP报文段的数据部分,至少要加上40字节的首部( TCP首部20字节 IP首部20字节 ,这里还没有考虑首部中的可选部分)才能组装成一个 IP数据报

若选择较小的MSS长度,网络的利用率就降低。设想在极端情况下,当TCP报文段只含有1字节的数据时,在IP层传输的数据报的开销至少有40字节(包括TCP报文段的首部和IP数据报的首部)。这样,对网络的利用率就不会超过1/41。到了数据链路层还要加上一些开销。但反过来,若TCP报文段非常长,那么在IP层传输时就有可能要分解成多个短数据报片。在终点要把收到的各个短数据报片组成成原来的TCP报文段,当传输出错时还要进行重传,这些也都会使开销增大。

因此,MSS应尽可能大些,只要在IP层传输时不需要分片就行。

由于IP数据报所经历的路径是动态变化的,因此在这条路径上确定的不需要的分片的MSS,如果改走另一条路径就可能需要进行分片。因此最佳的MSS是很难确定的。在连接过程中,双方都把自己能够支持的MSS写入这一字段,以后就按照这个数值传输数据,两个传送方向可以有不同的MSS值。若主机未填写这一项,则MSS的默认值是536字节长。因此,所有在互联网上的主机都应该接受的报文段长度是536+20(固定首部长度)=556字节

后来又增加了几个选项如窗口扩大选项、时间戳选项等。

窗口扩大选项是为了扩大窗口。

我们知道,TCP首部中窗口字段长度是16位,因此最大的窗口大小为64K字节。虽然这对早期的网络是足够用的,但对于包含卫星信道的网络,传播时延和宽带都很大,要获得高吞吐量需要更大的窗口大小。

窗口扩大选项占3字节,其中有一个字节表示移位值S。新的窗口值等于TCP首部中的窗口位数从16增大到(16+S)。移位值允许使用的最大值是14,相当于窗口最大值增大到2 (16+14)-1=2 30-1。

窗口扩大选项可以在双方初始建立TCP连接时进行协商。如果连接的某一端实现了窗口扩大,当它不再需要扩大其窗口时,可发送S=0选项,使窗口大小回到16。

时间戳选项占10字节,其中最主要的字段是时间戳字段(4字节)和时间戳回送回答字段(4字节)。时间戳选项有以下两个概念:

第一、 用来计算往返时间RTT。发送方在发送报文段时把当前时钟的时间值放入时间戳字段,接收方在确认该报文段时把时间戳字段复制到时间戳回送回答字段。因此,发送方在收到确认报文后,可以准确地计算出RTT来。

第二、 用于处理TCP序号超过2 32 的情况,这又称为防止序号绕回PAWS。我们知道,TCP报文段的序号只有32位,而每增加2 32 个序号就会重复使用原来用过的序号。当使用高速网络时,在一次TCP连接的数据传送中序号很可能被重复使用。例如,当使用15Mbit/s的速度发送报文段时,序号重复要6小时以上。但若用25Gbit/s的速率发送报文段,则不到14秒钟序号就会重复。为了使接收方能够把新的报文段和迟到很久的报文段区分开,则可以在报文段中加上这种时间戳。

功能 性能 的角度去理解

三次握手建立连接

第一次:

C S 发送一个 建立连接 的请求。此过程中携带一些报文属性信息,这些信息,存在于报文首部,有初始化用的信息,比如,有用于认证的信息。

初始化信息:如报文序列号、

SYN: TCP在数据通信之前,通过TCP首部发送的一个 SYN 标志位,作为建立连接的请求等待接收方确认应答。如果 S 发来确认应答,则认为可以进行数据通信,否则,就不能进行通信。

TCP规定:SYN=1 的报文段不能携带数据,但是要 消耗掉一个序号 :seq=x。

这个时候 C 进入 SYN-SENT ( 同步已发送 )状态。

第二次:

S 收到 C 请求后,如果同意建立连接,则向 C 返回确认信息:将 SYN ACK 都置 1 ,确认号为 ack=seq+1 (seq来自客户端),并携带自己的 初始化,同时用于认证的信息S

同理: SYN=1 的报文段不能携带数据,但是要 消耗掉一个序号 :seq=y。

这个时候 S 进入 SYN-RCVD ( 同步已接收 )状态。 C 收到 S 返回的确认信息后,进入 ESTABLISHED (已建立连接)的状态,

第三次:

C 收到 S 返回的确认信息后,向 S 再一次发送确认报文。 ACK 置为 1 ,确认号 ack=seq+1 (seq来自 S ),自己的 seq=x+1

TCP规定: ACK报文可以携带数据。但是,如果不携带数据,则不消耗序号,这时,下一数据报文段的序号仍是 seq=x+1 服务器 收到 客户端 返回的确认信息后,也进入 ESTABLISHED (已建立连接)的状态,

从功能角度去考虑前两次握手,从性能的角度去理解为什么需要第三次握手。

有第三次,是考虑到一种错误情况: 假设 C 发了一请求建立连接的报文,长时间未收到 S 的确认报文,则 C 会重发,这个时候 S 与之建立连接、完成数据通信、关闭了连接,这个时候 C 第一发出的请求建立连接的报文到达了 S , S 则会等待 C 发送数据,实际上 C 已经 CLOSED 了, S 就一直在这等待,浪费资源,

确切地说,应该是至少四次数据交互才能实现一个连接的彻底关闭。关闭连接,需要四个报文来指示关闭。

TCP是全双工通信的,所以在一端发送数据完毕后,还具有接收另一端的数据的能力,这就所谓的半关闭。

四次挥手

举个例子 :如果 C 的数据已经发送完毕, C 是不能立即关闭的,因为建立连接的通信双方是平等的。

C 首先告诉 S :“数据发送完毕“,这个消息在TCP报文的首部由 FIN 来标识,让 S 知道 C 是准备断开连接了。这是第一次挥手。

S 收到 C 发来的 FIN 标识的报文后,要给 C 端恢复一个 确认FIN 的消息,告诉 C 说,知道你的数据发完了。这是第二次挥手。

这个时候,如果 S 端的数据也发送完毕了,就给 C 发一个 FIN=1 报文。这是第三次挥手。

C 收到 S 发来的 FIN 标识的报文后,要给 S 端恢复一个 确认FIN 的消息,告诉 C 说,知道你的数据发完了。这是第四次挥手。

然后就彻底断开连接了。

TCP的状态变迁图


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/12633675.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存