TCP协议简介

TCP协议简介

一、传输层协议简介

经过最上层的HTTP、DNS等应用层协议后,我们应该思考,承载应用层协议的是什么呢?答案是传输层协议——TCP和UDP。
在这里插入图片描述
图1 计算机网络协议栈

传输层协议运作在网络层(IP)之上,为应用层协议提供一定运输层特性的服务。运输层的两大主要协议是TCP和UDP:

  • **TCP:**向上层提供面向连接的、可靠的、基于字节流的服务。
  • **UDP:**简单封装IP层,向上层提供尽力而为的、无连接的服务。

二、TCP报文格式

在这里插入图片描述

图2 TCP报文段格式

  • 源端口号&目标端口号:

    头两个字段描述的是建立TCP连接时双方的端口号(port),TCP是一种面向连接的协议,由源IP地址、源端口号、目标IP地址、目标端口号四元组确定了唯一的TCP会话。
    在这里插入图片描述
    图3 TCP四元组示意

    不过,问题是,为什么在TCP报文中只有源端口和目标端口呢,源和目标地址哪去了呢?显然,源和目标IP的字段交给下层的IP协议头来记录就好了,运输层不需要再记录了。

  • 序列号:

    用来解决“网络乱序”问题,防止此次连接的TCP收到历史连接下的数据。在TCP连接建立之初,由双方主机各生成一个随机数通过SYN包发送给对方,此后每发送一次数据,则序列号加上数据字节数。

  • 确认应答号:

    使用TCP通讯需要每次都对收到的报文段发送确认应答,应答号为对端下一次发送数据的序列号的期望

    比如,本次发送数据序列号为100,如果接收端收到100,则应发送ACK101给对方,表示期望收到对方的101号报文段。(以字节为单位的,要注意TCP是流式传输的,没有包的概念)

  • 控制位:

    一个6位大小的数据段,每一位的0/1分别表示:URG(紧急指针数据)、ACK(此报文为应答报文)、RST(复位报文,收到此报文的进程应断开TCP连接)、SYN(连接报文,表示希望建立连接)、FIN(结束报文,表示希望关闭连接)

  • 首部长度:

    标识TCP头的字节数,标注好TCP头的长度,递交上层是去掉TCP头,只把若干TCP报文的数据以字节流的形式交给上层。

三、TCP的基本性质

  1. **面向连接:**和UDP不一样,TCP必须要建立连接才能通信,而且必须是一对一的连接。

  2. **可靠:**TCP协议向上层保证,不论网络或者链路情况有多糟糕,都可以使报文一定可以无丢失地到达对端。

    为此,TCP使用了更高级的一系列机制来保证可靠性:重传机制、滑动窗口机制、流量控制、拥塞控制等。

  3. **字节流:**TCP协议是基于字节流的。这意味着TCP可以保证报文传输的有序性和无重复性。但字节流并不意味着TCP就不是按逐个数据包来传送的了!TCP当然还是以数据包为单位来传输。所以,当发送丢失中间报文段,TCP会等待此报文段重传之后才会将所有的TCP报文段递交给上层协议。(这就是为什么HTTP/3.0弃用了TCP协议的原因)

    和UDP不同,TCP的字节流性质意味着上层协议可能一次收到多个TCP数据包,直到要接受的字节流全部接受完了为止,但包和包之间是没有边界的,这就需要应用层协议正确地解析TCP数据包了(一般来说有两种方法处理粘包:特殊字符规定界限、数据中包含此次报文数据长度的字段);而UDP是把用户一次要发送的内容全部封装在一个包中,接收端上层一次只能收到这一个包(或者一个也收不到,丢了)

  4. **无边界:**TCP协议中的数据是无边界标注的,意味着没有标注包和包之间的边界,而一次接受又很可能有多个TCP包过来,所以需要上层协议正确的解析连续的TCP包,避免粘包问题(HTTP协议有一套自己的报文解析方式处理粘包,不用HTTP也要自己设计一个报文解析方案才行)。

  5. **TCP分片:**与UDP不同,TCP会在传输层对较大的数据包进行分组传送,而不是像UDP那样一股脑地把数据都放在一个包里都发出去。

    TCP的分片机制是怎样工作的呢?

    首先,我们知道,IP层是有分片机制的,要搞清楚为什么TCP也要分片呢?

    网络层分片是为了适应链路层网络的最大传输单元(MTU),比如以太网的最大传输单元为1500字节。所有协议层的头部+数据如果多于1500B,就要放到下一个IP数据包了。。。这看起来没什么问题,但是问题出在,如果有一个IP层数据包丢失,则所有此次TCP报文段封装的IP层数据包全要重传(因为IP层没有重传机制,需要依靠TCP的重传机制来重传),这明显得不偿失。。。

    因此,如果在TCP所在的传输层就对超过MTU的数据分片,那么丢失此片时,只要重传一片(或少量几片)IP数据包即可!

    TCP协议判断网络层下发的数据大小是否超过MSS来判断是否需要分片。MSS=MTU-IP头部-TCP头部。
    在这里插入图片描述

    图4 到了链路层时的数据包结构

四、UDP简介

UDP数据报格式:
在这里插入图片描述

图5 UDP数据报格式

我们都知道,一个二元组(目标IP,目标port)确定一个UDP流向。没必要加上源端的IP和port。因为UDP是典型的渣男,只管发出去,并不负责。。。

但UDP头格式里也可以指定源端口或者不指定,当指定源端口时,就可以像TCP那样,允许对端收到报文后发送ACK给发送端。

另外,与TCP不同的是,UDP具有包长度字段,而TCP则具有头部长度字段。

UDP特性:

  • **不面向连接:**不面向连接意味着UDP可以一端像多个对端发送UDP数据报。
  • **提供尽力而为的服务:**没有任何确保报文可靠到达的机制。
  • **有界限的数据报:**简单粗暴地一股脑把本次要传送的数据塞进一个UDP数据报中,接收端应用层一次也只会收到一个(或者0个)UDP数据报。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值