TCP传输控制协议总结

2024-02-20 13:48

本文主要是介绍TCP传输控制协议总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 TCP位于TCP/IP四层协议的第三层,属于传输层协议。它提供面向连接的 可靠的字节流服务。

 TCP通过一下方式提供服务:

   1. 应用数据被分割成TCP认为最合适发送的数据块。这和UDP完全不一样,应用程序产生的数据报长度保持不变。由TCP传递给IP的信息单位称为报文段或段。

   2.当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能即是收到一个确认,将重发这个报文段。

   3.当TCP收到法子TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一妙。

   4.Tcp将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到检验和有错误,Tcp将丢弃这个报文段和不确认该报文。

   5.Tcp报文段作为ip数据报来传输,而IP数据包的到达可能会失序,因此TCP报文段的到达可能会失序。如果有必要,TCP将对收到的数据进行排序,以正确的顺序将数据交给应用层。

  6. 既然IP数据包会发生重复,tcp的接收端必须丢弃重复的数据。

  7.TCP还能提供流量控制。TCP连接的每一方都有固定大小的缓冲空间。tcp的接受端只允许另一端发送接收端所能接纳的数据。

一.TCP首部:


TCP的愿端口和目的端口以及ip报文中的源IP和目的IP构成唯一的一个连接。一个IP地址和一个端口号成为一个插口。   

序列号的选择:系统初始序列号为0,每个0.5秒增加6400,并每隔9.5小时又回到0.另外每建立一个连接后,这个变量将增加64000;

在TCP首部中有6个bit的标志位。它们中的多个可同时被设置成1.其中:

   URG:紧急指针有效

   ACK:确认一个报文

   PSH:希望将这个报文交给应用成

   RST:重建连接

   SYN:同步序号用来发起一个连接。

   FIN :发端完成发生任务。

   最常见的可选字段是最长报文大小,又称为MSS。每个连接方通常都在通信的第一个报文段(SYN)中指明这个选项。

   TCP报文段的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有TCP首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的情况下也会发送不带任何数据的报文段。

URG和PSH的区别:

     URG标志 URG 紧急指针有效。当URG=1时,表示分段中有紧急数据应当加速传送。
PSH标志 PSH 紧急位。当PSH=1时,要求发送方马上发送该分段,而接收方尽快的将报文交给应用层,不做队列处理。
URG=1,表示紧急指针指向包内数据段的某个字节(数据从第一字节到指针所指字节就是紧急数据),不进入接收缓冲(一般不都是待发送的数据要先进入发送缓存吗?就直接交给上层进程,余下的数据都是要进入接收缓冲的;一般来说TCP是要等到整个缓存都填满了后再向上交付,但是如果PSH=1的话,就不用等到整个缓存都填满,直接交付,但是这里的交付仍然是从缓冲区中交付的,URG是不要经过缓冲区的,千万记住!


二、TCP连接的建立和终止



连接的建立需要三次握手。

三次握手超时异常说明:

情形1:当client的SYN发送之后,sever离线;

client处理:在client发起SYN之后,client会重启一个定时器,初始值为1秒,在Linux下,默认重试次数为5次,重试的间隔时间从1s开始每次都翻售,5次的重试时间间隔为1s, 2s, 4s, 8s, 16s,总共31s,第5次发出后还要等32s都知道第5次也超时了,所以,总共需要 1s + 2s + 4s+ 8s+ 16s + 32s = 2^6 -1 = 63s,TCP才会把断开这个连接。

至于为什么初始值为1秒可查看http://www.tuicool.com/articles/qmauEnb

至于为什么会传5次,可设置net.ipv4.tcp_syn_retries = 1,详情可查看http://www.2cto.com/os/201307/230155.html

情形2:关于SYN Flood攻击

一些恶意的人就为此制造了SYN Flood攻击——给服务器发了一个SYN后,就下线了,于是服务器需要默认等63s才会断开连接,这样,攻击者就可以把服务器的syn连接的队列耗尽,让正常的连接请求不能处理。于是,Linux下给了一个叫tcp_syncookies的参数来应对这个事——当SYN队列满了后,TCP会通过源地址端口、目标地址端口和时间戳打造出一个特别的Sequence Number发回去(又叫cookie),如果是攻击者则不会有响应,如果是正常连接,则会把这个 SYN Cookie发回来,然后服务端可以通过cookie建连接(即使你不在SYN队列中)。请注意,请先千万别用tcp_syncookies来处理正常的大负载的连接的情况。因为,synccookies是妥协版的TCP协议,并不严谨。对于正常的请求,你应该调整三个TCP参数可供你选择,第一个是:tcp_synack_retries 可以用他来减少重试次数;第二个是:tcp_max_syn_backlog,可以增大SYN连接数;第三个是:tcp_abort_on_overflow 处理不过来干脆就直接拒绝连接了。

Linux系统对该参数设置方法如下:

net.ipv4.tcp_syncookies = 1
SYN Cookie是对TCP服务器端的三次握手协议作一些修改,专门用来防范SYN Flood攻击的一种手段。它的原理是,在TCP服务器收到TCP SYN包并返回TCP SYN+ACK包时,不分配一个专门的数据区,而是根据这个SYN包计算出一个cookie值。在收到TCP ACK包时,TCP服务器在根据那个cookie值检查这个TCP ACK包的合法性。如果合法,再分配专门的数据区进行处理未来的TCP连接。




这篇关于TCP传输控制协议总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/728411

相关文章

C# List.Sort四种重载总结

《C#List.Sort四种重载总结》本文详细分析了C#中List.Sort()方法的四种重载形式及其实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录1. Sort方法的四种重载2. 具体使用- List.Sort();- IComparable

SpringBoot项目整合Netty启动失败的常见错误总结

《SpringBoot项目整合Netty启动失败的常见错误总结》本文总结了SpringBoot集成Netty时常见的8类问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一、端口冲突问题1. Tomcat与Netty端口冲突二、主线程被阻塞问题1. Netty启动阻

SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)

《SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)》本文总结了SpringBoot项目整合Kafka启动失败的常见错误,包括Kafka服务器连接问题、序列化配置错误、依赖配置问题、... 目录一、Kafka服务器连接问题1. Kafka服务器无法连接2. 开发环境与生产环境网络不通二、序

python3中正则表达式处理函数用法总结

《python3中正则表达式处理函数用法总结》Python中的正则表达式是一个强大的文本处理工具,用于匹配、查找、替换等操作,在Python中正则表达式的操作主要通过内置的re模块来实现,这篇文章主要... 目录前言re.match函数re.search方法re.match 与 re.search的区别检索

Python版本与package版本兼容性检查方法总结

《Python版本与package版本兼容性检查方法总结》:本文主要介绍Python版本与package版本兼容性检查方法的相关资料,文中提供四种检查方法,分别是pip查询、conda管理、PyP... 目录引言为什么会出现兼容性问题方法一:用 pip 官方命令查询可用版本方法二:conda 管理包环境方法

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

Spring 依赖注入与循环依赖总结

《Spring依赖注入与循环依赖总结》这篇文章给大家介绍Spring依赖注入与循环依赖总结篇,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Spring 三级缓存解决循环依赖1. 创建UserService原始对象2. 将原始对象包装成工

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

Linux之UDP和TCP报头管理方式

《Linux之UDP和TCP报头管理方式》文章系统讲解了传输层协议UDP与TCP的核心区别:UDP无连接、不可靠,适合实时传输(如视频),通过端口号标识应用;TCP有连接、可靠,通过确认应答、序号、窗... 目录一、关于端口号1.1 端口号的理解1.2 端口号范围的划分1.3 认识知名端口号1.4 一个进程