传输层之UDP与TCP的首部
从通信信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能的最底层。

传输层位于应用层和数据链路层之间,主要有两个协议,用户数据报协议UDP(User Datagram Protocol)、传输控制协议TCP(Transmission Control Protocol)。
UDP在发送数据前不需要建立连接,所以首部不需要存储太多数据,只有四部分(源端口、目的端口、长度、检验和),各占2个字节,其中长度属性并没必要,因为完全可以在数据链路层计算出来,这里存在是为了保障头部占据8字节。

这里增加了一个【伪首部】,伪首部的数据是不会发送到下一层的,仅仅是用于检验和增强校验的功能,检验和将首部(包括伪首部)和数据部分一起计算。
UDP请求抓包后可以看到只有几项数据,源端口52364,目的端口53,总长度43字节,检验和看起来无效。

但TCP就不同了,发送数据前需要建立连接,并且尽可能的保障数据可靠交付,首部会有更多的属性来记录信息。

- 序号(Sequence Number) --- 4字节, TCP传输过程中每一个字节都有编号,建立连接后,序号表示TCP数据部分的第一个字节编号(实际是一个非常大的值,非常大的值 - 固定值 = 小的编号,同一请求有一个固定值,固定值来源于建立连接时seq=0时的值)
- 确认号(Acknowledgment Number) --- 期望对方下一次传过来的TCP数据部分的第一个字节编号
- 数据偏移 --- 4位,范围0x0101-0x1111,换成十进制乘以以4为首部长度(20-60字节)
- 保留 --- 暂时没什么用,占6位(标志位有三位没什么用就划到了保留位中),有些资料会说占3位,标志位占9位
- 标志位(Flags) --- 6位
- URG: urgent(紧急)--- 为1时,紧急指针中的数据才有作用
- ACK: acknowledgment(确认)--- 为1时,确认号字段才有效
- PSH: push --- 交互式网络通信才有用
- RST: reset(重置)--- 为1时,表示tcp连接中出现问题,要释放连接并重新建立连接
- SYN: synchronization(同步,用于建立连接)--- syn=1,ack=0时表明建立连接,服务器同意时回复syn=1,ack=1
- FIN: finish(终止连接)--- 为1时,表示要求释放连接
- 窗口(Window) --- 2字节,流量控制功能,告知下一次允许发送的数据大小
- 检验和(checksum) --- 2字节,计算伪首部(12字节、不会传递给网络层) + 首部 + 数据
- 紧急指针: 2字节,urg为1时生效,放置的是长度,表示tcp数据中前x位是紧急数据,尽快传送
- 选项:长度可变,当建立连接时,可靠传输和流量控制时需要

从抓包数据可以看到,序号为0,但它真实的序号是一个非常大的数字(631127820),确认号为0,数据偏移为8,乘以4得出的首部长度为32字节,标志位折叠起来了,里面的syn是1,其余都是0,这里是建立连接的时候。
窗口大小64240,检验和看起来无效,紧急指针为0,选项中有12字节,里面定义了一些建立连接需要用的其它数据,加上首部其他属性的默认20字节,与总长度32字节对应。
首部存储信息的不同决定着UDP和TCP存在很大的差异。

UDP适合实时的场景,比如直播、视频通话,即使有些时候卡顿,没听清内容、没看到画面,也不影响通信的正常进行。
TCP正好相反,适用于需要数据完整的场景,比如邮件、浏览器、文件传输等,这些场合如何丢失了一些文字和数据,可能语义就完全变了,会对内容完整性有较大影响。
而TCP又如何做到保障数据的可靠传输呢?敬请期待我下一篇文章~
以上就是 传输层之UDP与TCP的首部的内容 , 更多有关 前端、网络协议 的内容可以参考我其它的博文,持续更新中~
传输层之UDP与TCP的首部的更多相关文章
- Android程序员必知必会的网络通信传输层协议——UDP和TCP
1.点评 互联网发展至今已经高度发达,而对于互联网应用(尤其即时通讯技术这一块)的开发者来说,网络编程是基础中的基础,只有更好地理解相关基础知识,对于应用层的开发才能做到游刃有余. 对于Android ...
- java 网络通信传输层协议——UDP和TCP
本文原文由作者“zskingking”发表于:jianshu.com/p/271b1c57bb0b,本次收录有改动. 1.点评 互联网发展至今已经高度发达,而对于互联网应用(尤其即时通讯网专注的即时通 ...
- 网络协议学习笔记(四)传输层的UDP和TCP
概述 传输层里比较重要的两个协议,一个是 TCP,一个是 UDP.对于不从事底层开发的人员来讲,或者对于开发应用的人来讲,最常用的就是这两个协议.由于面试的时候,这两个协议经常会被放在一起问,因而我在 ...
- Linux内核--网络栈实现分析(五)--传输层之UDP协议(上)
本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明出处http://blog.csdn.net/yming0221/article/details/7532512 更多请看专栏, ...
- LwIP Application Developers Manual4---传输层之UDP、TCP
1.前言 本文主要讲解传输层协议UDP TCP 2.UDP 2.1 UDP from an application perspective 2.2 UDP support history in lwI ...
- Python进阶----网络通信基础 ,OSI七层协议() ,UDP和TCP的区别 , TCP/IP协议(三次握手,四次挥手)
Python进阶----网络通信基础 ,OSI七层协议() ,UDP和TCP的区别 , TCP/IP协议(三次握手,四次挥手) 一丶CS/BS 架构 C/S: 客户端/服务器 定义: ...
- 理解传输层中UDP协议首部校验和以及校验和计算方法的Java实现
UDP,全称User Datagram Protocol,用户数据报协议,是TCP/IP四层参考模型中传输层的一种面向报文的.无连接的.不能保证可靠的.无拥塞控制的协议.UDP协议因为传输效率高,常用 ...
- 传输层中的协议 TCP & UDP
面向连接的TCP协议 “面向连接”就是在正式通信前必须要与对方建立起连接.比如你给别人打电话,必须等线路接通了.对方拿起话筒才能相互通话.TCP(Transmission Control Protoc ...
- [19/04/13-星期六] 网络编程_基本概念(关注传输层、数据传输,TCP和UDP)
一.概念 ▪ 什么是计算机网络? 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统, 网络管理软件及网络通信协议的管理和协调下,实现资源共享和信 ...
- 实验:传输层:UDP协议 学习笔记
一.传输层协议 从之前介绍的网络层协议来看,通信的两端是两台主机,IP数据报首部就标明了这两台主机的IP地址.但是从传输层来看,是发送方主机中的一个进程与接收方主机中的一个进程在交换数据,因此,严格地 ...
随机推荐
- MySQL百万数据深度分页优化思路分析
业务场景 一般在项目开发中会有很多的统计数据需要进行上报分析,一般在分析过后会在后台展示出来给运营和产品进行分页查看,最常见的一种就是根据日期进行筛选.这种统计数据随着时间的推移数据量会慢慢的变大,达 ...
- 使用 Lambda 函数将 CloudWatch Log 中的日志归档到 S3 桶中
> 作者:[SRE运维博客](https://www.cnsre.cn/) > 博客地址:[https://www.cnsre.cn/](https://www.cnsre.cn/) &g ...
- 2020-10-03:java中satb和tlab有什么区别?
福哥答案2020-10-03:#福大大架构师每日一题# 简单回答:satb: snapshot-at-the-beginning,快照.tlab:thread local allocation buf ...
- 2020-12-01:java中,什么是安全点和安全区域?
福哥答案2020-12-04: 安全点用户线程暂停,GC 线程要开始工作,但是要确保用户线程暂停的这行字节码指令是不会导致引用关系的变化.所以 JVM 会在字节码指令中,选一些指令,作为"安 ...
- 2022-05-01:golang里,结构体B里包含一个结构体A和一个整型成员变量。现在要给结构体A实现一个方法,让它能访问到B的整型变量,这个方法应该怎么写? 如果还有结构体C,D,E,F...都和
2022-05-01:golang里,结构体B里包含一个结构体A和一个整型成员变量.现在要给结构体A实现一个方法,让它能访问到B的整型变量,这个方法应该怎么写? 如果还有结构体C,D,E,F-都和B一 ...
- Windows服务程序管理器 - 开源研究系列文章
这些天弄了一个Windows服务程序管理器,主要是对需要的Windows服务程序进行管理.这个也能够将自己开发的服务程序注册到操作系统里去运行. 1. 项目目录: 目录见下图,对代码进行 ...
- ICLR 2017-RL2: Fast Reinforcement Learning via Slow Reinforcement Learning
Key GRUs+TRPO+GAE 解决的主要问题 现有RL方法需要手动设置特定领域的算法 DRL学习的过程需要大量的试验牺牲了高样本复杂度(每个task需要数万次经验),相比人来说,这是由于缺乏先验 ...
- LINIUX 查询命令的 区别 chich whereis locate fing
我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索: which 查看可执行文件的位置. whereis 查看文件的位置. locate 配合数据库查看文件位置 ...
- SqlServer 设置用户只能访问特定表、特定数据库
设置用户只能访问特定表.特定数据库 一.只能访问特定数据库 1.[安全性]-[登录名]右击用户.打开属性,选择用户映射,勾选特定数据库 2. 如果 服务器角色 勾选了 [查看任意数据库],那么登录后会 ...
- Dubbo远程调用在IDEA无法打断点怎么破
以下是如何在IDEA中在Dubbo的分布式环境中设置远程调试的步骤: 1.首先,你需要在启动提供者服务时,加入一些JVM参数以开启调试服务.这些参数应该在你的启动脚本或者命令中.以下是一个常见的示例 ...