网络编程-TCP/IP协议栈-TCP协议

TCP协议

TCP协议作用
  • TCP协议位于协议栈的传输层。当应用层向TCP层发送用于网间传输的,用8字节表示的数据流,TCP则吧数据流分割成适当长度的报文段,最大传输段大小(MSS)通常受到改计算机连接的网络数据链路层的最大传送单元(MTU)限制(例如路由器每次传输数据的大小是固定的,并且是可以设置的,这个传输值就是MTU)。之后TCP吧数据包床底给IP层,由他来通过网络将包传送给接收端实体的TCP层。

  • TCP为了保证报文传输的可靠性,就给每个包一个序号,同时序号也保证传送到接收端实体的包的按顺序接收,然后,接收端实体对已成功收到的字节发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据(假设丢失)将会重传。

    • 在数据正确性与合法性上,TCP用一个 “校验和函数” 来检验数据是否有错误,在发送和接收时都要计算校验和;同时可以使用md5认证对数据进行加密
    • 在保证可靠性上,采用超时重传和捎带确认的机制
    • 在流量控制上,采用滑动窗口协议,协议中规定,对窗口内未经确认的分组需要重传
  • 在阻塞控制上,采用TCP拥塞控制算法,也称为AIMD算法。改算法主要包括三个主要部分:

    • 加性增,乘性减
    • 慢启动
    • 对超时事件做出反应
TCP的报头
  • 和协议一样,TCP协议也有他的报头部分。一下图表示
    在这里插入图片描述
  • 源端口:发送方的端口号
  • 目的端口:接受方的端口号
  • 序号:发送方的序号
  • 确认序号:接收方得到序号后回复的确认序号(ACK需要)
  • TCP首部长度:4bit,以32-bit字为单位。TCP首部长度,也是TCP报文数据部分的偏移量范围5~15,即20bytes ~50bytes,可选项部分最多允许40bytes
  • 标志位,主要用于标记该报文当前状态
    • URG:指示报文中有紧急数据,应该尽快传送,(相当于高优先级的数据)
    • ACK:确认序号(AN)有效
    • PSH:接到后尽快交付给接收的应用进程
    • RST:TCP链接中出现严重差错(例如服务器宕机),必须释放链接,在重新建立连接
    • SYN:处于TCP链接建立过程
    • FIN:发送端已经完成数据传输,请求释放链接

TCP协议连接三次握手

  • TCP是一个面向连接的协议,在每一层传输数据前,客户端和服务端需要进行连接,这个链接就是三次握手过程。

    • 第一次:客户端向服务器发送一个SYN(SEQ = x 客户端序号)报文给服务器端,进入SYN_SEND状态
    • 第二次:服务器端收到SYN报文,回应一个SYN(SEQ = y 服务端序号)ACK(ACK = x+1 确认号 = 客户端序号 + 1)报文,进入SYN_RECV状态
    • 第三次:客户端收到服务器端的SYN报文,回应一个ACK(ACK = y+1)报文,进入Established状态。
  • 如下图
    在这里插入图片描述

  • 三次握手的意义,为啥不是两次,因为两次通信后,客户端与服务器端都处于准备好状态,第三次是不是多余了?

  • 答案是:两次握手时,服务器提前进入准备状态之后,如果中途遇到网络中断,消息没有回传给客户端,客户端将永远借不到服务器的给入状态,那么服务端将资源浪费在一个不存在的连接上。

  • 三次握手并不保证绝对安全: 在三次握手过程中,Server发送SYN-ACK后,收到Client的ACK之前的TCP链接称为半连接(half-open connect),此时Server处于SYN_RCVD状态,当收到ACK后,Server转入ESABLISHED状态。SYN攻击就是在Client在短时间内伪造大量不存在IP地址,并向Server端不断发送SYN包,Server回复确认包,并等待Client的确认,由于源地址是不存在的,因此,Server需要不断重新发送直到超时,这些伪造的SYN包将长时间占用服务端未连接队列,导致正常SYN请求因为队列满无法进入而被丢弃,从而引起完了阻塞甚至系统瘫痪。SYN攻击时一种典型的DDOS攻击,检查SYN攻击的方式非常简单,即当Server上有大量半连接状态,并且IP地址是随机地址,则可以断定遭到SYN攻击,可以用如下命令查看:

#netstat -nap | grep SYN_RECV
TCP协议断开连接时候四次挥手
  • 既然TCP面向连接,那么肯定也有断开连接的操作,一个TCP完整的断开需要进行四次挥手。

    • 第一次:客户端向服务器发送FIN + ACK 报文,同时携带序号为 X,客户端进入FIN-WAIT1
    • 第二次:服务器端回复ACK报文。附带序号Z和确认序号X+1,表示服务器已经接收到客户端的报文。但是由于服务器可能还在处理事务,因此,报文并不会携带FIN标志。状态CLOSE WAIT
    • 第三次:在一段时间后,服务器已经处理完毕,发送带有FIN和ACK的报文,序号为Y,确认序号为X + 1.状态:ACK-LAST
    • 第四次:客户端发送ACK报文,序号X+1,确认序号Y+1。客户端进入:TIME_WAIT。服务端进入CLOSE(初始状态)。
      在这里插入图片描述
  • 如上图所示,我们关闭连接是四次挥手过程,但是建立连接是三次握手,断开多了一个过程:

    • 这是因为在连接过程中,服务器在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放再一个报文给客户端了。
    • 而关闭连接时候,当收到对方的FIN报文时候,仅仅标识对方不在发送数据了,但并不表示不在接受数据,并且服务端此时并不能保证已经将全部数据发送给对方,所以服务器方可以立即iclose,也可以发送一些数据给对方后在发送FIN报文给对方来表示现在关闭连接,因此,服务端ACK和FIN一般会分开发送,在这里就多了一个步骤
  • 在TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态,有如下两个原因:

    • 第一保证TCP协议的全双工连接能够可靠关闭
    • 保证这次连接的重复数据段从网络中消息

上一篇 网络编程-TCP/IP协议栈-IP协议
下一篇 网络编程-TCP/IP协议栈-UDP/HTTP协议

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/310565.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

互联网10年,激战如梦

— 1 —1969年,美国国防部研究计划署第一次将互联网应用于军事连接。随后美国西南部四所名校的四台计算机通过这项技术连接起来。谁也没想到,这项计划会对人类的命运产生如此重大影响。1993年,互联网真正诞生。美国白宫宣布开始提供「在线服务…

网络编程-TCP/IP协议栈-UDP/HTTP协议

UDP协议 UDP协议全称是用户数据报协议,在网络中她与TCP协议一样用于处理数据包,两个协议同处于协议栈的传输层,和TCP不同的是,UDP是一种无连接的协议栈。 因为UDP是无连接的,所以相对来说,UDP的报头比TCP要…

十问十答 Ms-PL 许可证

Microsoft 公共许可证(The Microsoft Public License)是微软为释出开源项目而编写和发布的自由开源软件许可证。如果你用 .NET 开发,你会经常碰见 Ms-PL。在微软的自由开源项目托管地 Codeplex(已寿终正寝,微软已战略转…

网络编程-HTTPS协议的实现原理

HTTP传输协议缺点 之前几篇文章中详细讲解了TCP/IP协议栈中的几个协议,其中个就有对HTTP做了一个比较详细的讲解。HTTP是基于TCP进行传输的,其中传输的内容都是明文报文数据,如果我是一个黑客,我会想办法获取这个HTTP消息体&…

从案例角度解析建模平台动态规则引擎

源宝导读:明源云ERP建模平台提供了强大的页面联动规则引擎,原来需要编写代码完成的联动控制逻辑,现在只需要点点鼠标,通过配置完成。本文从实际案例的角度出发,介绍原始的代码逻辑如何转化为引擎规则的过程。一、背景明…

想基于K8s按需扩展应用程序,可从这几方面入手

马修赫瑟(Matthew Heusser)在花费了十年时间进行编程,测试和项目管理之后,Matt Heusser于2011年创立了自己的公司Excelon Development。该协会前董事会成员Matt还是软件测试人员,是德国波茨坦最具影响力的敏捷测试专业…

windows环境下ELK平台搭建

背景 日志系统主要包括系统日志,应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器的软件,硬件信息,检查配置过程中的错误以及错误发生的原因。通常分析日志可以了解服务器的负荷,性能安全性,从而及时…

EntityFramework Core 3.x上下文构造函数可以注入实例呢?

今天讨论的话题来自一位微信好友遇到问题后请求我的帮助,当然他的意图并不是本文标题,只是我将其根本原因进行了一个概括,接下来我们一起来探索标题的问号最终的答案是怎样的呢?老规矩,首先我们定义如下上下文public c…

SpringCloud常见问题总结(一)

Eureka常见问题 Eureka注册服务慢 默认情况,服务注册到Eureka Server 的过程比较慢。在开发或者测试时候,如果能够加速注册的过程,从而提升工作效率。Spring Cloud官方文档详细描述了该问题的原因并提供了解决方案: //原文 Why…

[剑指offer]面试题21:包含min函数的栈

面试题21:包含min函数的栈 题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)。 栈内压入3、4、2、1之后接连两次弹出栈顶数字…

IO 模型知多少

1. 引言同步异步I/O,阻塞非阻塞I/O是程序员老生常谈的话题了,也是自己一直以来懵懵懂懂的一个话题。比如:何为同步异步?何为阻塞与非阻塞?二者的区别在哪里?阻塞在何处?为什么会有多种IO模型&am…

[剑指offer]面试题22:栈的压入、弹出序列

面试题22:栈的压入、弹出序列 题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1、2、3、4、5 是某栈的压栈序列,序列4、5、3、2、1…

Ubuntu上安装使用Docker

Docker简介 Docker是一个开源的容器引擎,他有助于更快的交付应用。Docker可以将应用程序和基础设施层做隔离,并且能将基础设施当做程序一样进行管理。使用Docker,可以更快的打包,测试以及部署应用程序,并且可以缩短从…

让 .NET 轻松构建中间件模式代码

让 .NET 轻松构建中间件模式代码Intro在 asp.net core 中中间件的设计令人叹为观止,如此高大上的设计何不集成到自己的代码里呢。于是就有了封装了一个简单通用的中间件模板的想法,以后有需要的时候就可以拿来即用。接口定义这里按执行的委托是同步还是异…

[剑指offer]面试题26:复杂链表的复制

面试题26:复杂链表的复制 题目:请实现函数ComplexListNodeClone(ComplexListNodepHead),复制一个复杂链表。在复杂链表中,每个结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling 指…

SpringCloud + Docker

Dockerfile构建Docker 镜像 注意这里说的Dockerfile是指的一个文本文件,类似txt,只不过名字是Dockerfile,里面编辑Docker的一些指令,指令作用在于描述构建镜像的细节。如下一个简单的案例,用上一节中下载的nginx镜像来…

红帽借“订阅”模式成开源一哥,首创者升任总裁

4 月 6 日,红帽公司宣布,产品和技术总裁 Paul Cormier 即日起任红帽总裁,并兼任首席执行官。Paul Cormier 是开源商业化“订阅”模式的提出者,这一模式促使红帽达成连续超70个季度的盈利,身价升至340亿美金&#xff0c…

Docker中数据管理

Docker数据管理 生产环境中,对数据进行持久化,或者需要在多个容器直接进行数据共享,这必然涉及到容器的一些数据管理的操作。容器中数据管理主要有两种方式: 数据卷(Data Volumes):容器内数据直…

C#两大知名Redis客户端连接哨兵集群的姿势

前言前面《Docker-Compose搭建Redis高可用哨兵集群》,我的思路是将Redis、Sentinel、Redis Client App链接到同一个网桥网络,这个网桥内的Redis Client App就可以使用ContainerIP访问网桥内任意redis节点。同一网桥网络访问规避了Docker上发生的NAT&…

Docker之Dockerfile详解

使用Dockerfile创建镜像 Dockerfile是一个文本格式的配置文件,我们可以利用Dockerfile来快速的创建一个自定义的镜像。 基本结构 Dockerfile由一行命令语句组成,并且支持以#开头的注释一般包括四个部分:基础镜像信息,维护者信息…