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

相关文章

Rust格式化输出方式总结

《Rust格式化输出方式总结》Rust提供了强大的格式化输出功能,通过std::fmt模块和相关的宏来实现,主要的输出宏包括println!和format!,它们支持多种格式化占位符,如{}、{:?}... 目录Rust格式化输出方式基本的格式化输出格式化占位符Format 特性总结Rust格式化输出方式

Python中连接不同数据库的方法总结

《Python中连接不同数据库的方法总结》在数据驱动的现代应用开发中,Python凭借其丰富的库和强大的生态系统,成为连接各种数据库的理想编程语言,下面我们就来看看如何使用Python实现连接常用的几... 目录一、连接mysql数据库二、连接PostgreSQL数据库三、连接SQLite数据库四、连接Mo

Git提交代码详细流程及问题总结

《Git提交代码详细流程及问题总结》:本文主要介绍Git的三大分区,分别是工作区、暂存区和版本库,并详细描述了提交、推送、拉取代码和合并分支的流程,文中通过代码介绍的非常详解,需要的朋友可以参考下... 目录1.git 三大分区2.Git提交、推送、拉取代码、合并分支详细流程3.问题总结4.git push

Kubernetes常用命令大全近期总结

《Kubernetes常用命令大全近期总结》Kubernetes是用于大规模部署和管理这些容器的开源软件-在希腊语中,这个词还有“舵手”或“飞行员”的意思,使用Kubernetes(有时被称为“... 目录前言Kubernetes 的工作原理为什么要使用 Kubernetes?Kubernetes常用命令总

Python中实现进度条的多种方法总结

《Python中实现进度条的多种方法总结》在Python编程中,进度条是一个非常有用的功能,它能让用户直观地了解任务的进度,提升用户体验,本文将介绍几种在Python中实现进度条的常用方法,并通过代码... 目录一、简单的打印方式二、使用tqdm库三、使用alive-progress库四、使用progres

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

Java向kettle8.0传递参数的方式总结

《Java向kettle8.0传递参数的方式总结》介绍了如何在Kettle中传递参数到转换和作业中,包括设置全局properties、使用TransMeta和JobMeta的parameterValu... 目录1.传递参数到转换中2.传递参数到作业中总结1.传递参数到转换中1.1. 通过设置Trans的

C# Task Cancellation使用总结

《C#TaskCancellation使用总结》本文主要介绍了在使用CancellationTokenSource取消任务时的行为,以及如何使用Task的ContinueWith方法来处理任务的延... 目录C# Task Cancellation总结1、调用cancellationTokenSource.

QT实现TCP客户端自动连接

《QT实现TCP客户端自动连接》这篇文章主要为大家详细介绍了QT中一个TCP客户端自动连接的测试模型,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录版本 1:没有取消按钮 测试效果测试代码版本 2:有取消按钮测试效果测试代码版本 1:没有取消按钮 测试效果缺陷:无法手动停

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert