TCP | TCP协议格式 | 三次握手

这篇具有很好参考价值的文章主要介绍了TCP | TCP协议格式 | 三次握手。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.TCP协议

为什么需要 TCP 协议 ?TCP 工作在哪一层?

IP网络层是不可靠的,TCP工作在传输层,保证数据传输的可靠性。 TCP全称为 “传输控制协议(Transmission Control Protocol”)。

TCP 是面向连接的、可靠的、基于字节流

  • 面向连接:一定是「一对一」才能连接,不能像 UDP 协议可以一个主机同时向多个主机发送消息,也就是一对多是无法做到的;
  • 可靠的:无论的网络链路中出现了怎样的链路变化,TCP有很多策略 都可以保证一个报文一定能够到达接收端;
  • 字节流:用户消息通过 TCP 协议传输时,消息可能会被操作系统「分组」成多个的 TCP 报文,如果接收方的程序如果不知道「消息的边界」,是无法读出一个有效的用户消息的。
2.TCP协议格式详解

TCP | TCP协议格式 | 三次握手,计算机网络,tcp/ip,网络,网络协议

  • 源端口号和目的端口号:表示数据是从哪个进程来, 到哪个进程去。通过端口号将报文交付给上一层

  • 4位TCP报头长度: 表示该TCP头部有多少个32位bit(有多少个4字节)。4个比特位[0000 -1111]最大是15再乘以4个字节(单位),一共能表示60个字节。报头长度 = 固定长度(20字节) + 选项。通过4位TCP报头长度就可以将一个完整报文的报头和有效载荷分离。

  • 窗口大小:通过read这样的接口,是将用户级缓冲区的数据拷贝都系统级缓冲区中,主机再将数据通过网络发送到目标主机,其实网络的发送本质也是拷贝。那么如果数据一直发,对方没有来得及接收,大量的数据"打满"了接收缓冲区导致数据丢包的问题,这是一种不可靠的表现。TCP保证可靠性,通过16位窗口大小来填写自己接收缓冲区的剩余空间,告知对方进行流量控制。

TCP | TCP协议格式 | 三次握手,计算机网络,tcp/ip,网络,网络协议

窗口的大小如何告知对方

Client向Server发送数据,Server收到报文会应答。应答也是基于TCP协议通信的,必须是一个完整的TCP报文(可以没有数据,但至少是完整的报头)!窗口大小通过应答报文告知Client,当然TCP会有**捎带应答(Server也要发送数据捎带的将窗口大小告知对方(数据+应答))**的机制,有可能不会发送单独的应答报文。
TCP | TCP协议格式 | 三次握手,计算机网络,tcp/ip,网络,网络协议

  • 序列号:用来解决网络包乱序问题

  • 确认序列号:表示确认序列号之前的数据,已经全部收到,下次发送请从确认序列号指定的数字开始发送。

    序列号和确认序列号的理解

    TCP为了提高效率,不会串行化的传输数据,而是Client发送一批数据给Server。那么Server无法得知报文的顺序而导致数据包乱序的问题,而乱序本身就是一种不可靠的表现。所以通过序列号,按序接收就能保证顺序问题

    Server对Client发送而来的数据序列号+1,响应确认序列号。表示确认序列号之前的数据,已经全部收到,什么意思呢,如:Server响应2001表示前面发送的2000个字节的数据都收到了,所以允许1001应答报文丢失。确认序列号允许少量的应答报文丢失(这里不携带数据),如果是数据丢失会有重传的机制。

    TCP | TCP协议格式 | 三次握手,计算机网络,tcp/ip,网络,网络协议

    当然序列号的初始值,是在建立连接时由计算机生成的随机数作为其初始值,通过 SYN 包传给接收端主机,每发送一次数据,就「累加」一次该「数据字节数」的大小。

    HTTP中会定义一个用户级的缓冲区,想象成一个大数组。系列号会根据数组的下标来确定会更好理解。

TCP | TCP协议格式 | 三次握手,计算机网络,tcp/ip,网络,网络协议

  • 6个标记位:区分TCP报文的类型

    TCP通信需要建立连接,建立完成之后才是正常通信,通信完毕后会断开连接。**不要扯什么,无论是建立连接的报文、正常通信的报文、还是断开连接的报文,都是一个完整的TCP报文!**如何区分是哪种类型的报文呢,这就可以根据报文中的标记位来区分。

    TCP | TCP协议格式 | 三次握手,计算机网络,tcp/ip,网络,网络协议

    1. SYN:设为 1 时,表示希望建立连接(称为同步报文段),并在其「序列号」的字段进行序列号初始值的设定

    2. ACK:设为 1 时,「确认应答」的字段变为有效;TCP 规定除了最初建立连接时的 SYN 包之外该位必须设置为 1

    3. FIN :设为 1 时,表示今后不会再有数据发送,希望断开连接。

    4. RST : 设为 1 时,对方要求重新建立连接; 把携带RST标识的称为复位报文段

    5. PSH:设为 1 时,提示接收端应用程序立刻从TCP缓冲区把数据读走。

      Client一直向服务器发送数据,有可能服务器,很繁忙没来得及读取接收缓存的内容,PSH字段提示接收端应用程序立刻从TCP缓冲区把数据读走;但如果有一个极端,应用程序就没有读取数据的方法,那这不扯了吗,要设计一个程序通信,结果又不读取数据,这像什么话啊!

TCP | TCP协议格式 | 三次握手,计算机网络,tcp/ip,网络,网络协议

  1. URG:设为 1 时,紧急指针有效

    Server服务器负载过大,无法处理Client发来的普通报文,因为报文需要按序排队。但又想知道Server在处理什么工作,可以在编码时设置MSG_OOB(如:1表示IO操作)这样的属性,然后将URG设置为1,让这个报文的紧急字段指向的数据有效,插队处理。

    16位紧急指针字段表示紧急数据的首地址,紧急数据不能太大,一般是首地址往后的1个字节

    TCP | TCP协议格式 | 三次握手,计算机网络,tcp/ip,网络,网络协议

3.TCP的三次握手和四次挥手
3.1.TCP的握手过程

这个地方参照的是小林哥的博客

TCP | TCP协议格式 | 三次握手,计算机网络,tcp/ip,网络,网络协议

  • 一开始,客户端和服务端都处于 CLOSE 状态。先是服务端主动监听某个端口,处于 LISTEN 状态。
  • 客户端会随机初始化序号(client_isn),将此序号置于 TCP 首部的「序号」字段中,同时把 SYN 标志位置为 1,表示 SYN 报文。接着把第一个 SYN 报文发送给服务端,表示向服务端发起连接,该报文不包含应用层数据,之后客户端处于 SYN-SENT 状态。
  • 服务端收到客户端的 SYN 报文后,首先服务端也随机初始化自己的序号(server_isn),将此序号填入 TCP 首部的「序号」字段中,其次把 TCP 首部的「确认应答号」字段填入 client_isn + 1, 接着把 SYNACK 标志位置为 1。最后把该报文发给客户端,该报文也不包含应用层数据,之后服务端处于 SYN-RCVD 状态。
  • 客户端收到服务端报文后,还要向服务端回应最后一个应答报文,首先该应答报文 TCP 首部 ACK 标志位置为 1 ,其次「确认应答号」字段填入 server_isn + 1 ,最后把报文发送给服务端,这次报文可以携带客户到服务端的数据,之后客户端处于 ESTABLISHED 状态。
  • 服务端收到客户端的应答报文后,也进入 ESTABLISHED 状态。

总结

TCP | TCP协议格式 | 三次握手,计算机网络,tcp/ip,网络,网络协议

任何一个网络协议都无法保证100%的可靠性!TCP建立连接的时候最后一个ACK应答,没有没有应答的,如果有应答有应答,那就衍生了鸡生蛋蛋生鸡的问题。但是三次握手能保证局部的可靠性。

为什么是三次握手?不是两次?四次?

首要原因是为了防止旧的重复连接初始化造成混乱

客户端先发送了 SYN(seq = 90)报文,然后客户端宕机了,而且这个 SYN 报文还被网络阻塞了,服务端并没有收到,接着客户端重启后,又重新向服务端建立连接,发送了 SYN(seq = 100)报文(注意!不是重传 SYN,重传的 SYN 的序列号是一样的)
TCP | TCP协议格式 | 三次握手,计算机网络,tcp/ip,网络,网络协议

其实,三次握手服务器最后才进入ESTABLISHED,通过这样奇数次连接的方式,如果建立过程中的报文丢失,都可以将失败的成本嫁接到客户端。 另外三次握手保证了通信的全双工验证,保证通信的局部可靠,还有就是可以同步双方初始序列号等。

无论是一次还是两次,客户端向服务端请求连接,SYN到达服务器就立马ESTABLISHED状态,服务器需要创建对应的内核数据结构维持连接,有明显的SYN洪水的问题。

而为什么不是四次,其实也可以是四次,但是TCP有捎带应答的机制,服务器向客户端发送SYN时捎带了ACK。说白了三次握手的最小次数的连接。文章来源地址https://www.toymoban.com/news/detail-842915.html

到了这里,关于TCP | TCP协议格式 | 三次握手的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 计算机网络—TCP和UDP、输入url之后显示主页过程、TCP三次握手和四次挥手

    TCP是面向连接的、可靠的,基于字节流的传输层通信协议 。 图片来源小林coding 序号:传输方向上字节流的字节编号。初始时序号会被设置一个随机的初始值(ISN),之后每次发送数据时,序号值 = ISN + 数据在整个字节流中的偏移。假设A - B且ISN = 1024,第一段数据512字节已经

    2024年02月14日
    浏览(49)
  • 【计算机网络】三次握手 四次挥手

    目录 1.三次握手 2.四次挥手 3.总结 三次握手和四次挥手是有连接特有的。三次握手,四次挥手指的是TCP有连接特点的中的步骤 。建立连接(三次握手),断开连接(四次挥手)。建立连接操作一般都是客户端主动发起,断开连接操作客户端和服务器都可以主动发起。 1.三次握手

    2024年02月08日
    浏览(41)
  • TCP | TCP协议格式 | 三次握手

    1.TCP协议 为什么需要 TCP 协议 ?TCP 工作在哪一层? IP网络层是不可靠的,TCP工作在传输层,保证数据传输的可靠性。 TCP全称为 “传输控制协议(Transmission Control Protocol”)。 TCP 是 面向连接的、可靠的、基于字节流 : 面向连接 :一定是「一对一」才能连接,不能像 UDP 协议

    2024年03月24日
    浏览(39)
  • 【计算机网络】TCP握手与挥手:三步奏和四步曲

    TCP(传输控制协议)是一种面向连接的可靠的传输协议。在建立连接和关闭连接时,TCP使用了三次握手和四次挥手的机制来确保通信的可靠性。 TCP是一种非常重要的传输层协议,被广泛应用于各种网络通信场景中。无论是企业内部的数据传输,还是互联网上的数据交换,都离

    2024年01月21日
    浏览(36)
  • 计算机网络-TCP协议

    TCP被称为面向连接的,因为在应用程序开始互传数据之前,TCP会先建立一个连接,该连接的建立涉及到 三次“握手 ”。 TCP的连接不是一条真实存在的电路,而是一条逻辑链接 ,其共同状态仅保留在两个通信端系统的TCP程序中。 TCP连接也是点对点的,即TCP连接只能存在于一

    2024年02月08日
    浏览(56)
  • 【计算机网络】TCP协议

    实验目的 应用所学知识: 1. 熟悉 TCP 的协议格式。 2. 理解 TCP 对序列号和确认号的使用。 3. 理解 TCP 的流量控制算法和拥塞控制算法。 实验步骤与结果 1.任务一: 将Alice.txt上传到服务器: 使用wireshark捕获数据包,看到计算机和gaia.cs.umass.edu之间的一系列 TCP 和 HTTP 通信,包

    2023年04月20日
    浏览(55)
  • 【计算机网络】传输层协议 -- TCP协议

    认识可靠性 现在的计算机大多都是基于冯诺依曼体系结构的 虽然这里的输入设备、输出设备、内存、CPU是在同一个机器上的,但是它们彼此间却是相互独立的。如果它们之间要进行通信,那就必须要用“线”连接起来,其中连接内存和外设之间的“线”叫做IO总线,连接CP

    2024年02月14日
    浏览(57)
  • 05.计算机网络——TCP协议

    TCP协议——TCP全称为 “ 传输控制协议 (Transmission Control Protocol)”,对数据的传输进行一个详细的控制。 源/目的端口号: 表示数据是从哪个进程来, 到哪个进程去; 32位序号/32位确认号: 用来支持确认应答和按序到达 4位TCP报头长度: 表示该TCP报头有多少个4字节大小; 6位标志位

    2024年02月16日
    浏览(51)
  • 【计算机网络】TCP协议详解

    目录 1. TCP协议头部格式 2. TCP协议原理  2.1 可靠传输机制 2.1.1 确认应答机制 2.1.2 超时重传机制 2.1.3 连接管理机制(三次握手,四次挥手) 2.1.4 流量控制 2.1.5 拥塞控制  2.2 效率机制  2.2.1 滑动窗口  2.2.2 延迟应答  2.2.3 捎带应答  3. 粘包问题  4. TCP的异常情况  5. TCP协议特

    2024年01月18日
    浏览(50)
  • 【计算机网络篇】TCP协议

    ✅作者简介:大家好,我是小杨 📃个人主页:「小杨」的csdn博客 🐳希望大家多多支持🥰一起进步呀! TCP(Transmission Control Protocol)是一种在计算机网络中广泛使用的传输层协议,用于在网络上可靠地传输数据。 TCP 提供了可靠的、面向连接的通信,并负责数据的划分、排

    2024年02月11日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包