UDP/TCP拾遗
1.UDP的特点
(1)UDP 是无连接的,即发送数据之前不需要建立连接。
(2)UDP 使用尽最大努力交付,即不保证可靠交付,同时也不使用拥塞控制。
(3)UDP 是面向报文的。UDP 没有拥塞控制,很适合多媒体通信的要求。
(4)UDP 支持一对一、一对多、多对一和多对多的交互通信。
(5)UDP 的首部开销小,只有 8个字节。
(6)发送方 UDP 对应用程序交下来的报文,在添加首部后就向下交付 IP 层。UDP 对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。应用层交给UDP多长的报文,UDP 就照样发送,即一次发送一个报文。接收方 UDP 对 IP 层交上来的 UDP用户数据报,在去除首部后就原封不动地交付上层的应用进程,一次交付一个完整的报文。应用程序必须选择合适大小的报文。
2.TCP报文段格式
(1)序号:本报文段发送数据的第一个字节的序号。
(2)确认号:期望收到的下一个报文段数据的第一个字节的序号。
(3)数据偏移:占4位。指数据起始处距离tcp报文段起始处的距离,以32位字(4字节)为计算单位。
(4)保留:占6位。未用。
(5)URG:紧急URG。当URG=1时,表明报文段有紧急数据,应当尽快传送。
(6)ACK:当ACK=1时,上面的确认号才管用。
(7)PSH:当PSH=1时,接收端应当将缓冲区中的数据尽快交付上层。
(8)RST:当RST=1时,表示TCP连接出现严重差错(比如主机崩溃等原因),必须释放连接,然后再重新建立运输连接。
(9)SYN:当SYN=1时,表示这是一个连接请求或者连接接受报文。
(10)FIN:当FIN=1时,表示要求释放连接。
(11)窗口:占2个字节。告诉对方设置发送窗口,单位为字节。
(12)检验和:计算检验和时要加上12个字节的伪首部。
(13)紧急指针:指出本报文段中紧急数据共有多少个字节。紧急数据在报文数据的最前面。
(14)选项:
MSS(最大报文段):MSS选项用于在TCP建立连接时,收发双方协商一个TCP报文段所能承载的最大数据长度。MSS选项只在初始化连接请求(SYN=1)的报文段中使用。选择合适的MSS很重要。如果MSS小了,网络利用率低。如果MSS大了,由于在网络层需要分片,也会影响网络性能。一般MSS的长度为MTU(1500)-IP首部(20)-TCP首部(20)=1460字节。
窗口扩大选项:占3字节,其中有一个字节表示移位值S。新的窗口值等于TCP首部中的窗口位数增大到(16 + S),相当于把窗口值向左移动S位后获得实际的窗口大小。
时间戳选项:占10字节,其中最主要的字段时间戳值字段(4字节)和时间戳回送回答字段(4 字节)。
选择确认选项:
3.TCP的特点
(1)TCP不提供广播或多播服务。每一条 TCP 连接只能有两个端点(endpoint),每一条TCP 连接只能是点对点的(一对一)。
(2)TCP 根据对方给出的窗口值和当前网络拥塞的程度来决定一个报文段应包含多少个字节(UDP 发送的报文长度是应用进程给出的)。
(3)TCP 可把太长的数据块划分短一些再传送。TCP也可等待积累有足够多的字节后再构成报文段发送出去。
(4)在发送完一个分组后,必须暂时保留已发送的分组的副本。
(5)分组和确认分组都必须进行编号。
(6)超时计时器的重传时间应当比数据在分组传输的平均往返时间更长一些。
注:
RTT(Round-Trip Time): 往返时延。在计算机网络中它是一个重要的性能指标,表示从发送端发送数据开始,到发送端收到来自接收端的确认(接收端收到数据后便立即发送确认),总共经历的时延。
往返延时(RTT)由三个部分决定:即链路的传播时间、末端系统的处理时间以及路由器的缓存中的排队和处理时间。其中,前面两个部分的值作为一个TCP连接相对固定,路由器的缓存中的排队和处理时间会随着整个网络拥塞程度的变化而变化。所以RTT的变化在一定程度上反映了网络拥塞程度的变化。简单来说就是发送方从发送数据开始,到收到来自接受方的确认信息所经历的时间。
(7)这种可靠传输协议常称为自动重传请求ARQ (Automatic Repeat reQuest)。ARQ 表明重传的请求是自动进行的。接收方不需要请求发送方重传某个出错的分组 。
(8)累积确认。
接收方一般采用累积确认的方式。即不必对收到的分组逐个发送确认,而是对按序到达的最后一个分组发送确认,这样就表示:到这个分组为止的所有分组都已正确收到了。累积确认有的优点是:容易实现,即使确认丢失也不必重传。缺点是:不能向发送方反映出接收方已经正确收到的所有分组的信息。
(9)TCP中发送缓存和接收缓存的作用
发送缓存存放:发送应用程序传送给发送方TCP准备发送的数据;TCP已发送出但尚未收到确认的数据。
接收缓存存放:按序到达的、但尚未被接收应用程序读取的数据;不按序到达的数据。
4.TCP和UDP在高并发和高负载下传输对比
(1)传输效率UDP要比TCP高,TCP保证可靠传输,协议栈需要处理重发等机制,会影响TCP传输效率。但是UDP传输效率虽然高,但是也要通过应用层相关协议来对传输质量做保证。
(2)稳定性上UDP也要比TCP高,这里的稳定性主要指服务端稳定性。TCP协议下,客户端的异常可能会影响服务端,比如客户端网络或者接受出现异常,会影响到服务端,服务端如果有缓存机制,会导致缓存变大,甚至可能造成溢出。
(3)但是TCP协议在实现上要比UDP简单,因为UDP需要在应用层上对传输质量做处理。
UDP/TCP拾遗的更多相关文章
- [转]UDP/TCP穿越NAT的P2P通信方法研究(UDP/TCP打洞 Hole Punching)
[转]UDP/TCP穿越NAT的P2P通信方法研究(UDP/TCP打洞 Hole Punching) http://www.360doc.com/content/12/0428/17/6187784 ...
- 如何计算UDP/TCP检验和checksum
如何计算UDP/TCP检验和checksum 一.下面的图是一个UDP的检验和所需要用到的所有信息,包括三个部分:1.UDP伪首部2.UDP首部3.UDP的数据部分(切记不要遗漏该部分,否则就~吐血了 ...
- Python复习笔记(六)网络编程(udp/tcp)
一.网络-udp(用户数据报协议) 用户数据报协议 类似写信,不安全,数据有可能丢 1.1 ip地址 注意: IP地址127.0.0.1 ~ 127.255.255.255 用于回路测试 私有ip地址 ...
- 【Windows socket+IP+UDP+TCP】网络基础
Windows Socket+网络 Winsock是 Windows下套接字标准. Winsock 编程分为UDP[Windows socket + UDP],TCP[Wi ...
- 计算机网络基础笔记 运输层协议UDP/TCP
目录 UDP 首部结构 主要特点 TCP 首部结构 主要特点 TCP 可靠性实现 停止等待ARQ协议 连续ARQ协议&滑动窗口协议 拥塞控制 TCP 运输连接管理 连接建立:三次握手 连接释放 ...
- Python Socket Programming UDP/TCP
基于UDP/TCP的套接字编程demo UDP 客户端/服务器 一个简单的基于UDP协议的客户端和服务器应用的进程通信. 逻辑: 客户端会给服务器发送小写的英文字母,服务器接受后,把它转化成大写再返回 ...
- linux中c语言和php语言通信代码UDP&TCP
linux中c语言和php语言通信代码UDP&TCP http://blog.chinaunix.net/uid-24015214-id-2644174.html UDP方式通信 服务器端 ...
- ip/udp/tcp包 学习
/** * 以太网 */ class Ethernet { static readonly size = 14; get Destination(): string { return [ this.v ...
- Linux IPC udp/tcp/UNIX域 socket编程
UNIX域套接字本地通信即在socket第一个参数中选择AF_LOCAL,socket是BSD提出的一种适用于所有的情况的进程间通信的方式,虽然现在多用于网络通信,但是本机内的进程间通信也是没有问题的 ...
随机推荐
- bzoj千题计划316:bzoj3173: [Tjoi2013]最长上升子序列(二分+树状数组)
https://www.lydsy.com/JudgeOnline/problem.php?id=3173 插入的数是以递增的顺序插入的 这说明如果倒过来考虑,那么从最后一个插入的开始删除,不会对以某 ...
- HDU 1020(连续同字符统计 **)
题意是要统计在一段字符串中连续相同的字符,不用再排序,相等但不连续的字符要分开输出,不用合在一起,之前用了桶排序的方法一直 wa,想复杂了. 代码如下: #include <bits/stdc+ ...
- Golang入门教程(四)变量声明
Go 语言变量名由字母.数字.下划线组成,其中首个字母不能为数字. 一.Go的语言结构 1.Go的语言基础部分由这几个部分组成 包声明 引入包 函数 变量 语句&表达式 注释 比如下面这个简单 ...
- Spark源码剖析 - SparkContext的初始化(二)_创建执行环境SparkEnv
2. 创建执行环境SparkEnv SparkEnv是Spark的执行环境对象,其中包括众多与Executor执行相关的对象.由于在local模式下Driver会创建Executor,local-cl ...
- Spring boot 配置自己的拦截器
框架使用的是spring boot 2.0 首先,自定义拦截器实现HandlerInterceptor接口,preHandler是在执行controller方法前执行的 此外还有两个方法,具体作用最 ...
- [设计模式] javascript 之 命令模式
模式定义: [定义]: 将一个请求封装成一个对象,使得你用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能. 组成: 调用者(Invoker),命令请求(Comman ...
- 二十四、Linux 进程与信号---wait 函数
24.1 wait 函数说明 24.1.1 waitpid---等待子进程中断或结束 waitpid(等待子进程中断或结束) 相关函数 wait,fork #include <sys/types ...
- ImportError: libcudnn.so.5: cannot open shared object file: No such file or directory
ubuntu16.04安装cuda8.0,tensorflow-gpu版本后,运行时报错: ImportError: libcudnn.so.5: cannot open shared object ...
- UE4 编译笔记
UE4 的功能被分成了很多的模块,在API文档里每个类都有 Module 这个属性(值为模块名)每个模块使用其他模块要在Build.cs里导入,像vs里的引入库.在构建时 PublicDependen ...
- MSSQL无法启动-原来电脑登录密码改了,重启后要设置
Sql Server (MSSQLSERVER) 服务无法启动 - 晓菜鸟 - 博客园 http://www.cnblogs.com/52XF/p/4230578.html --摘抄如下: 一.是 ...