• tcp协议讲解


    tcp协议讲解

    传输层的理解:

    两户人家通信,传输层相当于两家的管家,他们不参与信件的运输,他们会汇总家里要寄出的信,交给邮递员。同时会整理收到的信,并根据收件人将信分发给家里每个人。负责的管家(TCP)发现信件有问题,还会写信要求重新发一封回来。

    传输层的功能:

    传输层将应用层的报文分割成报文段(链路层最大MTU1500B,IP报头通常20B,TCP报头通常20B,所以MSS(最大报文段)通常为1460B,即应用层传来的数据)
    进程之间的端到端通信
    UDP有多路复用/分解,差错检验
    TCP有多路复用/分解,流量控制,拥塞控制,可靠传输,差错检验

    多路复用与多路分用:

    多路复用指的是由不同的进程套接字接收的数据,将它们用同一协议封装,形成报文段,并传输(管家收集要寄出的信,统一一起寄)
    多路分解指的是将报文段的数据传给对应的进程套接字(管家收了好多信,将它们分发给不同的家人)

    tcp协议是面向连接的

    tcp是面向连接的,即需要建立连接(三次握手后),才能相互传数据。

    tcp提供可靠性,实现了丢失重传。RTT的估算

    比如网线电路干扰,数据丢失(物理失败)

    对方网卡(性能失败)

    TCP通过给所发送数据的每一个段管理一个序列号进行排序

    底层内部已经排序,read读的时候已经排好序了

    TCP提供流量控制,和拥塞控制

    接收窗口 该字段用于流量控制,即接收方此时tcp的缓存可以接收的字节

    发送窗口=min(拥塞窗口,接收窗口)
    拥塞窗口是仅由发送方所决定的,它根据网络上阻塞程度(即3个冗余ack和超时)来决定拥塞窗口的大小  
    而接收窗口是由接收方决定的
    
    • 1
    • 2
    • 3

    区分于拥塞控制,拥塞控制是当检测到拥塞时,遏制发送方的速率
    而流量控制是消除发送方使接收方缓存溢出的可能性。
    例如UDP没有流量控制,当接收方速率跟不上发送方速度时,会出现丢失分组
    所以拥塞控制是全局的,涉及网络上的主机和路由
    流量控制是点对点的。

    TCP的连接是全双工的

    同时发送接受是互不干扰的,因为走的是不同的线

    TCP协议头和窗口分析

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ARDJb9VT-1668153827838)(C:/Users/hch/AppData/Roaming/Typora/typora-user-images/image-20221111151758196.png)]

    源端口,目的端口

    比如8080 什么的软件端口

    序号

    序号,确认号是tcp用来可靠传输的
    TCP是建立在不可靠的网络层传输的可靠传输
    (管家收到错的信件,就要求重发,直到收到正确的信件,再接收到给收信人,这样可以保证收件人信件的正确性,从收件人的角度上,这个是个稳定可靠的连接)

    tcp报文是建立在字节流上的   
    序号是建立在传输的字节流上(从0开始)
    因此一个报文段的序号是建立在传输的字节流上  
    (所以序号字段这么长....4B)
    序号 是 报文段的首字节
    确认号是  主机A期望从主机B收到的下一字节的序号
    
    
    可靠传输主要靠序号确认,主要有三种方法:
    1. 停止-等待协议
    2. 后退N帧协议
    3. 选择重传协议
    
    TCP的可靠传输类似后退N帧协议与选择重传协议的结合,
    后退N帧协议即只接受有序的报文段,采用“累计确认”的方式
    选择重传协议即每一帧都需要确认,可以接收失序的报文段
    
    TCP实践中为接收方保留失序的字节,同时采用“累计确认”的方式(对有序接受到的进行最后一帧确认,而不是每帧都确认)。
    
    冗余ACK:主机A 向主机B 发送1 2 3 4 5 的报文,其中2号报文丢失,主机B接收到1 3 4 5 返回
    3个 ack=2的报文(期望收到2),主机A 收到3个冗余ACK则重传2
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    eg:(注意序号,数据) A向B 发送seq=x 数据长度为y的报文[x,x+1…x+y-1]
    则B回给A的报文段的ack=x+y

    数据偏移:首部长度

    首部长度(4bit),指的是tcp报头长度,单位是4B(一个字)
    注意udp报头中的长度是udp数据报的字节数(单位是字节,且为2B)

    表示数据开始的地方离TCP段的起始处有多远。

    标志字段

    6bit

    URG ACK PSH RST SYN FIN
    
    
    
    URG:相当于优先级高
    ACK:ACK=1时表示确认号有效
    PSH:PSH=1 不等缓存存满就提交给上层应用层
    RST:不接受该连接,请换连接
    SYN:SYN=1时 为请求连接报文或请求响应报文
    FIN:FIN=1时 为连接释放报文段
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    校验和

    大白话:怎么样保证自己传的数据正确嘞?直接加起来得一个数,传过去。

    那边得到数据也加起来 看还是这个数不

    16bit 发送方的UDP对报文段中的所有16比特字的和(不是偶数字节时,用全0字节填充)进行反码计算,计算的时候要加入伪首部(12B)计算,将得到的结果放入校验和中,接收方将所有16比特字与该校验和相加并取反,若全为1,代表正确,否则丢弃。

    关于tcp 与udp它们校验码都是验证全部 包括报头+数据 甚至还添加了伪首部,连ip也进行了验证.
    而ip报文中校验和只验证了ip报头。关于为什么要重复验证?(两个不一定是绑定的 邮局要检查信件少了没 管家也要看信件错没错误,同时还要检查送去的邮局对不对)

  • 相关阅读:
    Application UI
    ROS 2 Humble Hawksbill 之 f1tenth gym
    JAVA经典百题之温度转换
    [手写系列] 带你实现一个简单的Promise
    Google | Google Kubernetes Engine 集群实战
    【day03】流程控制语句
    海思 VI接入视频流程
    若依使用EasyExcel导入和导出数据
    Water 2.6.3 发布,一站式服务治理平台
    (71)MIPI DSI LLP介绍(十一)
  • 原文地址:https://blog.csdn.net/hch977/article/details/127807991