• UDP和TCP首部格式 学习笔记


    一. UDP首部格式

    UDP的首部由源端口号,目标端口号,包长及校验和组成.  

    • 源端口号 (source port)           发送端端口. 字段长度16位,是可选项. 没有源端口号时设置为0 .  如用于某些单方面发送更新消息不需要接收端任何返回和应答.
    • 目标端口号(destination port)   接收端端口. 字段长度16位
    • 包长度(length)                      保存了UDP首部的长度跟数据的长度之和.  单位为字节(8位字节)
    • 校验和(checksum)                 是为了提供可靠的UDP首部和数据而设计. (计算略复杂,此处不赘述)

    二. TCP首部格式

    TCP的首部相比于UDP要复杂的多.  另外,TCP中没有表示包长度和数据长度的字段.  可以由IP层获知TCP的包长,由TCP的包长可知数据的长度. 它的首部格式由以下几个部分组成:

    • 源端口号.        发送端端口,字段长16位.  
    • 目标端口号      接收端端口,字段长16位
    • 序列号(sequence number)         字段长32位,有时也叫序号,是指发送数据的位置.  每发送一次数据,就累加一次该数据字节的大小. 序号不会从0或者1开始,而是建立连接时由计算机生成的随机数作为其初始值,通过SYN包传给接收端主机.  然后再将每转发过去的字节数累加到初始值上表示数据的位置.  此外,再建立和端口连接时发送的SYN包和FIN包虽然并不携带数据,但是也会作为一个字节增加对应的序列号. 
    • 确认应答号(acknowledgement number)   字段长32位.  是指下一次应该接收到的数据的序列号.  实际上,它是指已收到确认应答号减一为止的数据.  发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收. 
    • 数据偏移(data offset)   该字段表示TCP所传输的数据部分应该从TCP包的哪个位开始计算,当然也可以把它看作TCP首部的长度. 该字段长4位,单位为4字节(即32位). 
    • 保留(reserved)           该字段主要是为了以后扩展时使用,其长度为4位. 一般设置为0,但即使收到的包在该字段不为0,此包也不会被丢弃.
    • 控制位(control flag)    字段长度为8位,每一位从左至右分别为CWR,ECE,URG,ACK,PSH,RST,SYN,FIN. 这些控制标志也叫做控制位. 当它们对应位上的值为1时, 代表了不同的信息如下:
      • CWR  (congestion window reduced)   与后面的ECE标志都用于IP首部的ECN字段. ECE标志为1时, 则通知对方已将拥塞窗口缩小.
      • ECE    表示ECN-Echo.  置为1会通知通信对方,从对方到这边的网络有拥塞. 在收到数据包的IP首部中ECN为1时将TCP首部中的ECE设置为1. 
      • URG (urgent flag) 为1时,表示包中有紧急处理的数据. 在紧急指针中会涉及到
      • ACK (acknowledgement flag) 为1时,确认应答的字段变为有效.  TCP规定除了最初建立连接时的SYN包之外该位必须设置为1. 
      • PSH  (push flag) 为1时,表示需要将接受到的数据立刻上传给上层应用协议.  PSH为0时,则不需要理解传而是先进行缓存.
      • RST  (reset flag) 该位为1时,表示TCP连接中出现异常必须强制端口连接. 
      • SYN (synchronize flag)用于建立连接.  SYN为1时表示希望建立连接,并在其序列号的字段进行序列号初始值的设定.(synchronize本身有同步的意思.也就意味着建立连接的双方,序列号和确认应答号需要保持同步)
      • FIN (fin flag) 该位为1时,表示今后不会再有数据发送,希望断开连接. 当通信结束希望断开连接时,通信双方的主机之间就可以相互交换FIN位置为1的TCP段. 每个主机又对对方的FIN包进行确认应答以后就可以断开连接. 不过,主机收到FIN设置为1对TCP段以后不必马上回复一个FIN包,而是可以等到缓冲区中所有的数据都因已成功发送而被自动删除之后再发.
    • 窗口大小(window size)。该字段长度为16位.  用于通知从相同TCP首部的确认应答号所指位置开始能够接收的数据大小(8字节). TCP不允许发送超过此处所示大小的数据. 不过,如果窗口位0,则表示可以发送窗口探测,以了解最新的窗口大小. 但这个数据必须是1个字节.
    • 校验和(checksum)   和UDP一样,也是为了校验数据的正确性.  不同的是TCP的校验和无法关闭.
    • 紧急指针(urgent pointer)   字段长为16位. 只有在URG控制位为1时有效.该字段的数值表示本报文段中紧急数据的指针. 如何处理紧急指针属于应用的问题.  一般在暂时中断通信,或中断通信的情况下使用.  例如在web浏览器中点击停止按钮,或者使用telnet输入c t r l+c时都会有URG为1的包.  此外, 紧急指针也用作表示数据流分段的标志.
    • 选项(options) 选项字段用于提高TCP的传输性能.  因为根据数据偏移(首部长度)进行控制, 所以其最大长度为40字节.
  • 相关阅读:
    vue分页效果
    百度联想
    【java基础之jdk源码】集合类
    【java基础之jdk源码】Object
    深入理解abstract class和interface
    mysql索引类型 normal, unique, full text
    JSP中两种include的区别
    详解mysql int类型的长度值问题
    《Think in JAVA》之每日一读(initianlize)——2013/11/12、13
    探索ORM ————iBati(一)
  • 原文地址:https://www.cnblogs.com/sunnydaybyday/p/15620365.html
Copyright © 2020-2023  润新知