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的小事情的更多相关文章

  1. 第二十七天- 网络通信协议 TCP UDP 缓冲区

    1.网络通信协议 osi七层模型:按照分工不同把互联网协议从逻辑上划分了层级 socket层 2.理解socket: Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计 ...

  2. TCP/UDP区别&&心跳包机制【转】

    转自:https://www.jianshu.com/p/6d93a3c21c34 UDP:用户数据报协议:主要用在实时性要求比较高的以及对质量相对较弱的地方.但是面对现在高质量的线路不会容易丢包,除 ...

  3. Fixed-Length Frames 谈谈网络编程中应用层(基于TCP/UDP)的协议设计

    http://blog.sina.com.cn/s/blog_48d4cf2d0101859x.html 谈谈网络编程中应用层(基于TCP/UDP)的协议设计 (2013-04-27 19:11:00 ...

  4. 网络基础--简单理解什么是DNS? TCP? UDP? Http? Socket?

    什么是IP 协议?  协议就是为了实现网络通信而创建的一系列规范.  通常我们的网络模型从上到下共分为4层: 应用层, 传输层, 网络层 和数据链路层. IP协议属于网络层协议,它精确定义了网络通信中 ...

  5. 高性能 TCP & UDP 通信框架 HP-Socket v3.3.1

    HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...

  6. 高性能 TCP & UDP 通信框架 HP-Socket v3.2.3

    HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...

  7. 高性能 TCP & UDP 通信框架 HP-Socket v3.2.2 正式发布

    HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...

  8. tcp/udp高并发和高吐吞性能测试工具

    在编写一个网络服务的时候都比较关心这个服务能达到多少并发连接,而在这连接的基础上又能达到一个怎样的交互能力.编写服务已经是一件很花力气的事情,而还要去编写一个能够体现结果的测试工具就更加消耗工作时间. ...

  9. TCP/UDP详解

    转载:http://www.cnblogs.com/visily/archive/2013/03/15/2961190.html, 作者:望梅止渴 相关: HTTP协议详解  深入理解HTTP协议 T ...

随机推荐

  1. js中的兼容问题汇总

    在使用js的过程中,往往会发现关于IE浏览器的兼容问题,当然微软现在自己也打算抛弃IE,推出了edge浏览器,对于前端来说是个好消息. 但IE的用户占比仍然不容小觑,因此这里整理下常见的几个兼容问题附 ...

  2. 【Nginx】基于Consul+Upsync+Nginx实现动态负载均衡

    一.Http动态负载均衡 什么是动态负载均衡 动态负载均衡实现方案 常用服务器注册与发现框架 二.Consul快速入门 Consul环境搭建 三.nginx-upsync-module nginx-u ...

  3. Day004_Linux基础_基础命令之tar打包解包

    基础命令之 打包,和解包. tar zcvf 打包的参数  tar zcvf /tmp/etc.tar.gz /etc  将/etc/下的文件压缩成一个压缩包 z  通过gzip工具进行压缩 c 表示 ...

  4. Java中ElasticSearch的删除示例

    public class DeleteElasticAPI { private static RestClient restClient; static { restClient=RestClient ...

  5. 史无前例的RNN讲解

    这篇博客不是一篇讲解原理的博客,这篇博客主要讲解time_steps,如果这篇博客没有让你明白time_steps,那么算我无能. 我曾翻阅各大网站,各大博客,他们的对RNN中time_steps的讲 ...

  6. Python(Head First)学习笔记:四

    4 持久存储:文件存储.读写 数据保存到文件:在学习的过程中出现了一个问题,老是报一个错:SyntaxError: invalid syntax: 这个是语法错误,后来搜了下才知道是python2.7 ...

  7. Docker下kafka学习三部曲之二:本地环境搭建

    在上一章< Docker下kafka学习,三部曲之一:极速体验kafka>中我们快速体验了kafka的消息分发和订阅功能,但是对环境搭建的印象仅仅是执行了几个命令和脚本,本章我们通过实战来 ...

  8. opencv边缘检测报错

    cnts = cv2.findContours(edged_image.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)cnts = cnts[0] if ...

  9. STL中关于全排列next_permutation以及prev_permutation的用法

    这两个函数都包含在algorithm库中.STL提供了两个用来计算排列组合关系的算法,分别是next_permutation和prev_permutation. 一.函数原型 首先我们来看看这两个函数 ...

  10. Java中关于泛型集合类存储的总结

    集合类存储在任何编程语言中都是很重要的内容,只因有这样的存储数据结构才让我们可以在内存中轻易的操作数据,那么在Java中这些存储类集合结构都有哪些?内部实现是怎么样?有什么用途呢?下面分享一些我的总结 ...