网站首页 > 文章精选 正文
TCP协议(Transmission Control Protocol)传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议,下面我们就来看看关于TCP协议相关的内容。
什么是TCP?
它是一种面向连接的、可靠的、基于字节流的传输层通信协议。
面向连接
一定是进行一对一的连接,而不是像是UDP一样可以一个主机同时向多个主机进行广播,也就是说使用TCP是无法进行广播的。
可靠的
根据我们的了解知道TCP协议是安全可靠的,也就是说无论网络链路中出现了什么样的变化,最终TCP都可以保证一个报文一定能够到达接收端。
字节流
当用户使用TCP协议传输消息的时候,消息数据可能会被操作系统拆分成多个TCP的报文,如果在接收端不知道所要接收的消息数据在什么时候结束的话,那么就无法去分割出一个有效的用户消息。并且TCP报文是有序进行传递的,当前一个报文没有接到的话,那么即使出现了后面发送的报文被接到,也不会先将这个包丢给应用层处理。如果出现了重复报文的时候TCP还会自动进行丢弃。
为什么需要TCP协议?
计算机网络有两种分层模式,一种是OSI参考模型,一种是TCP/IP分层模型。我们知道IP层其实是不可靠的,因为他不能保证网络数据包可以正常的发送和接收,也不能保证在整个的发送数据的过程中数据的完整性。既然这样的话为了保证网络数据包的可靠性,那么就需要传输层的协议进行控制。
这是因为TCP协议是一个为传输层工作的可靠协议,它能够保证接收端接收到的网络包是无损的、并且是没有间隔的、而是根据上面的介绍它对数据冗余进行了自动处理,并且这些数据包虽然被进行了拆分,但是还是按照顺序有序进行处理的。
TCP格式
我们是如何确定一个TCP链接的唯一性呢?
就需要我们的四个基本信息,源地址、源端口、目标地址、目标端口。
其中,源地址和目标地址的信息描述都在IP的32为头部中,其作用是通过IP协议将数据报文发送给对应的主机。
而源端口和目标端口则在TCP的头部信息中各占16位,其作用是告诉TCP协议应该讲报文数据发送到哪个进程中。
既然这样如果一个IP服务端监听了一个端口?那么它所对应的TCP最大连接数应该如何计算呢?
我们知道一般在实现服务端服务的时候,我们会固定一个端口号进行监听,然后等待客户端去连接服务端的对应接口。所以客户端的IP和端口是不固定的。所以对于一个端口它所能连接的最大的TCP连接数应该是,客户端的IP数量与客户端端口号的乘积。
也就是说在IPV4的体系下,最大的TCP连接数应该是 2的32次方乘以2的16次方,因为IP的数量是2的32地方,而端口的数量是2的16次方。二者的乘积最大应该是2的48次方的连接数。
当然在实际使用的过程中,TCP的连接数是远远小于这个值的。原因有如下几个
- 文件描述符的数量:我们知道对于Linux服务器来讲,一切皆是文件,也就是说一个TCP链接就需要一个文件描述符进行描述,这个时候如果文件描述符被占满了就会出现Too many files的问题。而在Linux中对文件描述符做了如下的几种规定,第一、系统级别、也就是说当前系统支持打开最大的数量可以通过cat /proc/sys/fs/file-max,来进行查看。第二、用户级别,指定的用户打开的最大数量可以通过 cat /etc/security/limits.conf 来进行查看。第三、进程级别,单个进程打开的最大数量。通过cat /proc/sys/fs/nr_open进行查看。
- 内存限制:影响TCP连接数的另一个原因就是内存,在每一次TCP连接进行建立连接到的时候就会开辟一块内存空间来进行数据处理。但是毕竟操作系统内存是有限的,所以并不能支持无限制的去建立TCP连接,如果内存被占满则会出现内存溢出的问题。
TCP参数介绍
除了上面介绍到的源端口、目标端口,TPC协议头部还有序列号、确认应答号、头长度、校验位等信息。
序列号
在连接建立的时候计算机会随机生成一个数作为初始值,通过SYN数据包传递到接收的主机,然后每次应答就会自动进行加一操作。用来保证网络传输数据包的顺序问题。
确认应答号
其实就是TCP协议希望能够收到的应答信息中的序列号,当发送端接收到这个应答之后就可以确认数据是被正常接收的。这主要是用来解决数据丢包的问题。
控制位
在TCP头部就几个控制位,其中比较重要的有如下几个。
- ACK:当这个位置为1的时候,就表示确认应答的字段是有效的,在TCP中除了第一次建立连接的的SYN包之外,其他的时候这个位置必须为1。
- RST:当这个位置为1的时候,表示TCP连接出现了异常,必须马上强制断开。
- SYN:当这个位置为1的时候,表示需要去建立TCP连接,并且在序列号的位置进行初始值的设定。
- FIN:当这个位置为1的时候,表示数据发送完成,希望可以断开TCP连接,当我们的数据传输完成之后,需要断开连接了,这个时候客户端和服务端就会相互交换带有FIN标识位1的数据包进行断开连接。
猜你喜欢
- 2025-02-03 「ModbusTCP协议详解」内容有点多,但讲得很详细
- 2025-02-03 tcpdump抓udp包示例 及IP、TCP、UDP协议格式
- 2025-02-03 网络隐蔽通道构建关键技术研究综述
- 2025-02-03 为什么TCP要做成流式协议,而非包?
- 2025-02-03 计算机网络中MSS和MTU的区别(mss与mtu区别及对应关系)
- 2025-02-03 存储FC 网络(简述存储网络引入fc后的优点有哪些)
- 2025-02-03 苹果iphone12充电器品牌选择哪个 充电器功率推荐
- 2025-02-03 作为一名架构师,需要掌握的一些基础网络知识
- 2025-02-03 计算机网络参考模型(计算机网络参考模型有哪些)
- 2025-02-03 23 个问题 TCP 疑难杂症全解析(tcp异常)
- 05-05MyBatis的三种分页方式,你学废了吗?
- 05-05如何写一个简单的分页(最简单的分页)
- 05-05详解如何使用Spring Data JPA进行数据的分页与排序
- 05-05手速太快引发分页翻车?前端竞态陷阱揭秘
- 05-05前端分页机制的具体实现(分页前端需要做什么)
- 05-05一个后勾腿动作,有效疏通血管,改善下肢发麻,促进全身燃脂
- 05-05大型调相机起动及并网研究(什么是调相机,与发电机区别)
- 05-05你们都是托:动态对比度其实是骗你的
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 稳压管的稳压区是工作在什么区 (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)