TCP/UDP的小事情
UDP:
没有复杂的控制机制,面向无连接的通信服务。
常用于:
包总量少的通信
音视频传输(即时通信)
TCP:
对传输、发送、通信、进行控制的协议。面向有连接的协议,只有在确认通信对端存在时才会发送数据,UDP是对端不存在也会发送。
通过检验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠的传输。
① 通过序列号和确认应答提高TCP的可靠性
- 确认应答(ACK):当发送端数据达到接收主机时,接受主机会返回一个已收到消息的通知,这就是ACK。如果发送端没有收到确认应答,就会进行重发。
- 序列号:按顺序给发送数据标上号码的编号,接收端查询接收数据TCP首部中的序列号和数据长度,将自己下一步应该接受的序号作为确认应答返送回去。
- 接收端会根据序列号的判断需要接受数据。
- 通过序列号可以避免接受端收到数据,确认应答没有返给发送端,导致发送端一直重发数据的情况。
② 重发超时如何确定
- 重发超时是指在重发数据之前,等待确认应答到来的那个特定的时间间隔。如果超过这个时间还没有收到确认应答,发送端就会进行重新发送数据。
- 那么这个时间如何确定呢?根据不同网络波段拥堵情况不一样,需要计算每次发包的往返时间及其偏差。
③ 连接管理
- 使用TCP的首部字段进行管理TCP连接,一次连接与断开至少需要七次来回发包。

④ TCP以段来发送数据
- 在建立TCP的连接时,也可以确定发送数据包的单位,我们称其为最大消息长度MSS。最理想的情况是MSS正好是IP中不会被分片处理的最大数据。
- MSS是在三次握手时计算出来的,两端的主机发送连接请求时,会在TCP首部中写入MSS,告诉对方自己适应的尺寸,然后选择一个较小的值投入使用。
⑤ 利用窗口控制提高速度
- TCP以1个段为单位,每发一个段进行一次应答处理,这样处理有一个缺点,那就是包的往返时间越长通信性能就越低。为了解决这个问题,TCP就引入了窗口的概念。
- 窗口的大小是指无需确认应答而可以继续发送数据的最大值,如图,窗口大小为4个段。

⑥ 窗口控制与重发控制
- 连续三次收到同一个应答,会对其重发,高速重发精致。
⑦ 流控制
- 这种机制可以让发送端根据接受端的实际接受能力控制发送的数量。
- TCP首部中,专门有一个字段用来通知窗口大小。
- 接收端向发送端主机通知自己可以接受数据的大小,于是发送端会发送不超过这个限度的数据。
⑧ 拥塞控制
- 在通信一开始的时候,会有一个慢启动的算法的出的值,对发送数据量进行控制。避免通信开始时连续发包导致的网络拥堵。

TCP结构

TCP中没有表示包长度和数据长度的字段,可由IP层获知TCP的包长,有TCP的包长可获知数据的长度。
源端口号:
表示发送端端口号,字段长16位。
目标端口号:
表示接收端端口号,字段长16位。
序列号:
字段长32位,序列号是指发送数据所在的位置。每发送一次数据,就累加一次该数据的字节数的大小。
序列号不会从0或者1 开始,而是建立连接时由计算机产生的随机数作为初始值,通过SYN包传给接收端主机,然后再由每转发过去的字节数累加到初始值上表示数据的位置。此外,在建立连接和断开连接时发送的SYN包和FIN包虽然本身不携带数据,但是也会作为一个字节增加对应的序列号。
确认应答号:
确认应答号字段长度为32位,是指下一次应该收到的数据的序列号。实际上,它是指已收到的确认应答减一为值得数据。发送端在收到这个确认应答以后可以认为在这个序号之前的数据都已经被正常接收到了。
数据偏移:
该字段表示TCP所传输的数据部分应该从TCP包的哪个位开始计算,当然也可以把它看做是TCP首部的长度。该字段长4位,单位字节4字节即32位。如果该字段的值为5,那说明从TCP包的最一开始到20字节位置都是TCP首部,余下部分是TCP数据。
保留
该字段主要是为了以后扩展使用,一般设置为0,但即使收到的包中该字段不为0,也不会丢弃。
控制位
每一位从左至右分别为CWR,ECE,URG,ACK,PSH,RST,SYN,FIN。

- CWR:CWR标志与后面的ECE标志,都用于IP首部的ECN字段,ECE的标志位1时,则通知对方已将阻塞窗口缩小。
- ECE:ECE标志,置为1时会通知对方,从对方到这边的网络有阻塞。在收到数据包IP首部中ECN为1时将TCP首部中ECE设置为1,
- URG:该位为1时,表示包中有需要紧急处理的数据。对于需要紧急处理的数据,会在后面的紧急指针中在进行解释。
- ACK:该位为1时,确认应答有效,TCP规定除了最初建立连接时的SYN包之外该位必须设置为1。
- PSH:该位为1时,表示需要将受到的数据立刻传给上层应用协议,为0时,则不需要穿而是先进行缓存。
- RST:该位为1时,表示TCP连接中出现异常必须强制断开连接。
- SYN:用于建立连接。SYN为1时表示希望建立连接,并在其序列号的字段进行序列号初始值的设定。
- FIN:该位为1时,表示今后不会再有数据发送,希望断开连接,当通信结束希望断开连接时,通信双方的主机之间就可以相互交换FIN位置为1的TCP段,每个主机又对对方的FIN包进行确认应答以后就可以断开连接。不过,主机收到FIN设置为1 时的TCP段,以后不必马上回复一个FIN包,而是等到缓冲区中所有的数据都因成功发送而被自动删除后在发送确认应答。
窗口大小
该字段长为16,用于通知从相同TCP首部的确认应答号所指位置开始能够接受数据大小,TCP不允许发送超过此处所示大小的数据。如果窗口大小为0,表示窗口探测,以了解最新的窗口大小。
校验和
同UDP
紧急指针
本报文中的紧急数据的指针。
选项
提高TCP的性能。
UDP结构

除去数据部分正是UDP的首部,UDP首部由源端口号、目标端口号、包长、校验和组成。
包长度
该字段保存了UDP首部的长度跟数据的长度之和。
校验和
校验和是为了提供可靠的UDP首部和数据而设计。
TCP/UDP的小事情的更多相关文章
- 第二十七天- 网络通信协议 TCP UDP 缓冲区
1.网络通信协议 osi七层模型:按照分工不同把互联网协议从逻辑上划分了层级 socket层 2.理解socket: Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计 ...
- TCP/UDP区别&&心跳包机制【转】
转自:https://www.jianshu.com/p/6d93a3c21c34 UDP:用户数据报协议:主要用在实时性要求比较高的以及对质量相对较弱的地方.但是面对现在高质量的线路不会容易丢包,除 ...
- Fixed-Length Frames 谈谈网络编程中应用层(基于TCP/UDP)的协议设计
http://blog.sina.com.cn/s/blog_48d4cf2d0101859x.html 谈谈网络编程中应用层(基于TCP/UDP)的协议设计 (2013-04-27 19:11:00 ...
- 网络基础--简单理解什么是DNS? TCP? UDP? Http? Socket?
什么是IP 协议? 协议就是为了实现网络通信而创建的一系列规范. 通常我们的网络模型从上到下共分为4层: 应用层, 传输层, 网络层 和数据链路层. IP协议属于网络层协议,它精确定义了网络通信中 ...
- 高性能 TCP & UDP 通信框架 HP-Socket v3.3.1
HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...
- 高性能 TCP & UDP 通信框架 HP-Socket v3.2.3
HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...
- 高性能 TCP & UDP 通信框架 HP-Socket v3.2.2 正式发布
HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...
- tcp/udp高并发和高吐吞性能测试工具
在编写一个网络服务的时候都比较关心这个服务能达到多少并发连接,而在这连接的基础上又能达到一个怎样的交互能力.编写服务已经是一件很花力气的事情,而还要去编写一个能够体现结果的测试工具就更加消耗工作时间. ...
- TCP/UDP详解
转载:http://www.cnblogs.com/visily/archive/2013/03/15/2961190.html, 作者:望梅止渴 相关: HTTP协议详解 深入理解HTTP协议 T ...
随机推荐
- cogs 313. [POI2001] 和平委员会(2-SAT
http://cogs.pro:8080/cogs/problem/problem.php?pid=pyzQimjkj 题意:有n个集合,每个集合有俩元素,要从n个中各选一个放一堆,但是有的俩不能同时 ...
- lightoj 1021 - Painful Bases(数位dp+状压)
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1021 题解:简单的数位dp由于总共就只有16个存储一下状态就行了.求各种进制能 ...
- 关于Math常用的方法
1. 常用的Math用法 Math.random() //0-1 的随机数 Math.round() //四舍五入取整 Math.ceil() //向上取整 Math.floor() //向下取整 M ...
- 漫谈JavaScript中的作用域(scope)
什么是作用域 程序的执行,离不开作用域,也必须在作用域中才能将代码正确的执行. 所以作用域到底是什么,通俗的说,可以这样理解:作用域就是定义变量的位置,是变量和函数的可访问范围,控制着变量和函数的可见 ...
- 分析spring4和spring5日志中的不同
日志在工作中起到关键作用,我们经常使用它来打印关键信息,方便分析,或者是输出错误信息,用于bug排查,spring中同样使用了日志进行信息的输出,但是spring4和spring5之间的日志又有些不同 ...
- Redis是否安装
1.Redis对否安装(安装好了会出现下面对应的代码) [lk@localhost /]$ whereis redis-cli redis-cli: /usr/local/bin/redis-cli ...
- 从零开始入门 K8s| 详解 Pod 及容器设计模式
作者|张磊 阿里云容器平台高级技术专家,CNCF 官方大使 一.为什么需要 Pod 容器的基本概念 我们知道 Pod 是 Kubernetes 项目里面一个非常重要的概念,也是非常重要的一个原子调度单 ...
- 纯css耍个透明正方体转一转
效果 效果图如下 实现思路 定义一个最外层的容器,用来控制显示的位置 定义一个父容器,用来设置元素被查看位置的视图,这里使用到CSS3的perspective 属性 定义子容器,设置为相对定位,利 ...
- 由 [SDOI2012]Longge的问题 探讨欧拉函数和莫比乌斯函数的一些性质和关联
本题题解 题目传送门:https://www.luogu.org/problem/P2303 给定一个整数\(n\),求 \[ \sum_{i=1}^n \gcd(n,i) \] 蒟蒻随便yy了一下搞 ...
- Python数据分析入门案例
转载自 https://blog.csdn.net/lijinlon/article/details/81517699 Data analysis by Python 入门 1. 重复数据处理 在Da ...