前言

计算机与网络设备要相互通信,双方就必须基于相同的方法。比如,如何探测到通信目标、由哪一边先发起通信、使用哪种语言进行通信、怎样结束通信等规则都需要事先确定。不同的硬件、操作系统之间的通信,所有的这一切都需要一种规则。而我们就把这种规则称为协议(protocol)

文章相关视频讲解:

C/C++ Linux服务器开发高级架构学习视频点击:C/C++Linux服务器开发高级架构师/Linux后台架构师-学习视频

底层原理到徒手实现 TCP/IP网络协议栈

tcpip协议栈与网络API的关联,udp的并发性比tcp强?

TCP/IP 是互联网相关的各类协议族的总称。比如:TCP,UDP,IP,FTP,HTTP,ICMP,SMTP 等都属于 TCP/IP 族内的协议。

【TCP/IP协议是一个协议簇。里面包括很多协议的。UDP只是其中的一个。之所以命名为TCP/IP协议,因为TCP,IP协议是两个很重要的协议,就用他两命名了。】

  • 链路层:负责封装和解封装IP报文,发送和接受ARP/RARP报文等。
  • 网络层:负责路由以及把分组报文发送给目标网络或主机。【处理传输层被分组和重组的报文数据包,并且规定以何种方式将数据包传输给对方】
  • 传输层:负责对报文进行分组和重组,并以TCP或UDP协议格式封装报文。【TCP负责对报文进行分组和重组,为应用层提供处于网络连接中的两台计算机之间的端到端的数据传输】
  • 应用层:负责向用户提供应用程序,比如HTTP、FTP、Telnet、DNS、SMTP等。

在网络体系结构中网络通信的建立必须是在通信双方的对等层进行,不能交错。 在整个数据传输过程中,数据在发送端时经过各层时都要附加上相应层的协议头和协议尾(仅数据链路层需要封装协议尾)部分,也就是要对数据进行协议封装,以标识对应层所用的通信协议。

TCP

TCP(Transmission Control Protocol,传输控制协议)是面向连接的、可靠的字节流服务。【流就是指不间断的数据结构,你可以把它想象成排水管中的水流。】

也就是说,在收发数据前,必须和对方建立可靠的连接。

这一过程和打电话类似:先拨号振铃,等待对方接电话,说喂,再说自己是谁。在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的传输层。

当一台计算机想要与另一台计算机通讯时,两台计算机之间的通信需要畅通且可靠,这样才能保证正确收发数据。

例如,当你想查看网页或查看电子邮件时,希望完整且按顺序查看网页,而不丢失任何内容。当你下载文件时,希望获得的是完整的文件,而不仅仅是文件的一部分,因为如果数据丢失或乱序,都不是你希望得到的结果,于是就用到了TCP。

1. TCP连接过程

如下图所示,可以看到建立一个TCP连接的过程为(三次握手的过程):

第一次握手

客户端向服务端发送连接请求报文段。该报文段中包含自身的数据通讯初始序号。请求发送后,客户端便进入 SYN-SENT 状态。

第二次握手

服务端收到连接请求报文段后,如果同意连接,则会发送一个应答,该应答中也会包含自身的数据通讯初始序号,发送完成后便进入 SYN-RECEIVED 状态。

第三次握手

当客户端收到连接同意的应答后,还要向服务端发送一个确认报文。客户端发完这个报文段后便进入 ESTABLISHED 状态,服务端收到这个应答后也进入 ESTABLISHED 状态,此时连接建立成功。

为什么 TCP 建立连接需要三次握手,而不是两次?这是因为这是为了防止出现失效的连接请求报文段被服务端接收的情况,从而产生错误。

关于C/C++ Linux后端开发网络底层原理知识 点击 后端开发学习资料 获取,内容知识点包括Linux,Nginx,ZeroMQ,MySQL,Redis,线程池,MongoDB,ZK,Linux内核,CDN,P2P,epoll,Docker,TCP/IP,协程,DPDK等等。视频学习链接点击:C/C++Linux服务器开发高级架构师/Linux后台架构师-学习视频

2. TCP断开链接

TCP 是全双工的,在断开连接时两端都需要发送 FIN 和 ACK。

第一次挥手

若客户端 A 认为数据发送完成,则它需要向服务端 B 发送连接释放请求。【此时请求的是释放客户端A到服务端B的连接,由客户端A先发出】

第二次挥手

B 收到连接释放请求后,会告诉应用层要释放 TCP 链接。然后会发送 ACK 包,并进入 CLOSE_WAIT 状态;【客户端A收到服务端B发送的ACK包后,即客户端到服务器的连接已经释放】

此时表明 A 到 B 的连接已经释放,不再接收 A 发的数据了【但是此时B到A的连接却还没有释放】。但是因为 TCP 连接是双向的,所以 B 仍旧可以发送数据给 A。

第三次挥手

服务端B如果此时还有没发完的数据会继续发送,完毕后会向客户端A发送连接释放请求,然后 B 便进入 LAST-ACK 状态。【此时请求的是释放服务端B到客户端A的连接,由服务端B发出】

第四次挥手

A 收到释放请求后,向 B 发送确认应答,此时 A 进入 TIME-WAIT 状态。该状态会持续 2MSL(最大段生存期,指报文段在网络中生存的时间,超时会被抛弃) 时间,若该时间段内没有 B 的重发请求的话,就进入 CLOSED 状态。当 B 收到确认应答后,也便进入 CLOSED 状态。【服务端B收到客户端A发送的ACK包后,即表示服务端到客户端的连接已经释放】

3. TCP协议的特点

  • 面向连接面向连接,是指发送数据之前必须在两端建立连接。建立连接的方法是“三次握手”,这样能建立可靠的连接。建立连接,是为数据的可靠传输打下了基础。
  • 仅支持单播传输

  每条TCP传输连接只能有两个端点,只能进行点对点【又叫端到端】的数据传输,不支持多播和广播传输方式。

  • 面向字节流

  TCP不像UDP一样那样一个个报文独立地传输,而是在不保留报文边界的情况下以字节流方式进行传输。

  • 可靠传输对于可靠传输,判断丢包,误码靠的是TCP的段编号以及确认号。TCP为了保证报文传输的可靠,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的字节发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据(假设丢失了)将会被重传。
  • 提供拥塞控制

  当网络出现拥塞的时候,TCP能够减小向网络注入数据的速率和数量,缓解拥塞

  • TCP提供全双工通信

   TCP允许通信双方的应用程序在任何时候都能发送数据,因为TCP连接的两端都设有缓存,用来临时存放双向通信的数据。当然,TCP可以立即发送一个数据段,也可以缓存一段时间以便一次发送更多的数据段(最大的数据段大小取决于MSS)

UDP

UDP (User Datagram Protocol,用户数据报协议),是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种非连接传输层协议,提供面向事务的简单不可靠信息传送服务,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上,故也不安全

UDP协议全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。在OSI模型中,在第四层——传输层,处于IP协议的上一层。

UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。

TCP协议的特点

面向无连接

首先 UDP 是不需要和 TCP一样在发送数据前进行三次握手建立连接的,想发数据就可以开始发送了。并且也只是数据报文的搬运工,不会对数据报文进行任何拆分和拼接操作。

具体来说就是:

  • 在发送端,应用层将数据传递给传输层的 UDP 协议,UDP 只会给数据增加一个 UDP 头标识下是 UDP 协议,然后就传递给网络层了。【如果使用TCP协议,TCP会对报文进行分组和重组】
  • 在接收端,网络层将数据传递给传输层,UDP 只去除 IP 报文头就传递给应用层,不会任何拼接操作

有单播,多播,广播的功能

UDP 不止支持一对一的传输方式,同样支持一对多,多对多,多对一的方式,也就是说 UDP 提供了单播,多播,广播的功能。

UDP是面向报文的

发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付IP层。UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。因此,应用程序必须选择合适大小的报文

4. 不可靠性

首先不可靠性体现在无连接上,通信都不需要建立连接,想发就发,这样的情况肯定不可靠。

并且收到什么数据就传递什么数据,并且也不会备份数据,发送数据也不会关心对方是否已经正确接收到数据了。

再者网络环境时好时坏,但是 UDP 因为没有拥塞控制,一直会以恒定的速度发送数据。即使网络条件不好,也不会对发送速率进行调整。这样实现的弊端就是在网络条件不好的情况下可能会导致丢包,但是优点也很明显,在某些实时性要求高的场景(比如电话会议)就需要使用 UDP 而不是 TCP。

从上面的动态图可以得知,UDP只会把想发的数据报文一股脑的丢给对方,并不在意数据有无安全完整到达。

TCP和UDP的比较

1. 对比

UDP

TCP

是否连接

无连接

面向连接

是否可靠

不可靠传输,不使用流量控制和拥塞控制

可靠传输,使用流量控制和拥塞控制

连接对象个数

支持一对一,一对多,多对一和多对多交互通信

只能是一对一通信【端到端通信】

传输方式

面向报文

面向字节流

首部开销

首部开销小,仅8字节

首部最小20字节,最大60字节

适用场景

适用于实时应用(IP电话、视频会议、直播等)

适用于要求可靠传输的应用,例如文件传输

2. 总结

1) TCP提供面向连接的传输,通信前要先建立连接(三次握手机制); UDP提供无连接的传输,通信前不需要建立连接。

2) TCP提供可靠的传输(数据的顺序有序,数据准确无差错,数据不丢失,数据不重复); UDP提供不可靠的传输(可能丢包,不保证数据顺序)。

3) TCP面向字节流的传输,因此它能将信息分割成组,并在接收端将其重组; UDP是面向数据报的传输,没有分组开销。

4) TCP提供拥塞控制和流量控制机制; UDP不提供拥塞控制和流量控制机制。

5) 对系统资源的要求:TCP较多(TCP头部有20个字节信息包),UDP(UDP信息包只有8个字节)

6) 虽然 UDP 并没有 TCP 传输来的准确,但是也能在很多实时性要求高的地方有所作为。

7) 对数据准确性要求高,速度可以相对较慢的,可以选用TCP

详解TCP协议与UDP协议的区别相关推荐

  1. TCP/IP详解--学习笔记(6)-UDP协议

    1.UDP简要介绍 UDP是传输层协议,和TCP协议处于一个分层中,但是与TCP协议不同,UDP协议并不提供超时重传,出错重传等功能,也就是说其是不可靠的协议. 2.UDP协议头 2.1.UDP端口号 ...

  2. 一篇文章带你详解 TCP/IP 协议(下)

    前面的第一二三章已在上篇讲解,还没看过的可以先看看:一篇文章带你详解 TCP/IP 协议(上) 本文继续讲解第四章. 四.网络层中的 IP 协议 IP(IPv4.IPv6)相当于 OSI 参考模型中的 ...

  3. 【转】:TCP/IP详解学习笔记(4)-ICMP协议,ping和Traceroute

    TCP/IP详解学习笔记(4)-ICMP协议,ping和Traceroute 分类:            TCP/IP详解学习笔记计算机网络2006-04-20 18:147970人阅读评论(1)收 ...

  4. 详解 TCP/IP 协议

    什么是TCP/IP协议 TCP/IP通信协议是目前最完整.最被广泛支持的通信协议,它可以让不同网络架构.不同操作系统的计算机之间通信,是Internet的标准通信协议. TCP的介绍 TCP也叫传输控 ...

  5. qi接收启动协议_TCP协议详解 - TCP服务的特点

    传输层协议主要有两个:TCP协议和UDP协议. TCP协议相对于UDP协议的特点是:面向连接.字节流和可靠传输. 使用TCP协议通信的双方必须先建立连接,然后才能开始数据的读写.双方都必须为该连接分配 ...

  6. 详解 TCP 和 UDP的概念、特点和区别

    文章目录 前言 TCP TCP 连接和断开 TCP 协议的特点 UDP UDP 协议的特点 UDP 协议的适用场合 TCP和UDP的比较 TCP和UDP的使用场景 参考 前言 TCP 和 UDP都是传 ...

  7. 网络层协议详解(主要是IP协议、ICMP协议和ARP协议)

    网络层协议详解(主要是IP协议.ICMP协议和ARP协议) 一.网络层的功能 定义了基于IP协议的逻辑地址: 连接不同的媒介类型: 选择数据通过网络的最佳路径. 二.IP数据包格式 第一层 版本:该字 ...

  8. TCP协议和UDP协议的区别及其应用

    下面是TCP和UDP的简单程序: 简单的TCP网络程序 https://blog.csdn.net/qq_37941471/article/details/80738319 简单的UDP网络程序 ht ...

  9. 网络攻城狮怎么看待TCP/IP协议与UDP协议?

    在互联网中,存在着各种不同层次的协议,它们分别的功能也是不同的.但做为网络攻城狮,对这些协议的使用以及区分是工作的必备技能.那今天以网络攻城狮的角度来告诉大家攻城狮是怎么看待TCP/IP协议与UDP协 ...

  10. TCP/IP协议与UDP协议的区别

    首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UDP协议的区别,我觉得这是没有从本质上弄清楚网络通信! TCP/IP协议是一个协议簇.里面 ...

最新文章

  1. echarts datazoom 显示的位置设置
  2. Why gdb crash if create too many threads ?
  3. iOS开展——全球应对MotionEvent
  4. 使用Java让android手机自动执行重复重启
  5. windows多线程同步--临界区
  6. ipsec在企业网中的应用(IKE野蛮模式)
  7. undefined reference to '__gxx_personality_v0'
  8. easy ui dialog 关闭之后的怪异问题
  9. 浙江大学计算机保研条件_【如何将保研成功率提至100%】来自取得浙大等五所顶尖院校保研资格学长的干货分享(联系导师章节已更)...
  10. 统一归档助企业撑起信息的保护伞
  11. java api 获取jvm实例_JVMTI那些事——和Java相互调用
  12. scrapy框架系列 (2) 一个简单案例
  13. 新零售到家O2O 和到店O2O的区别?
  14. 一张图架构示意图及简单分析
  15. re模块剩余和subprocess模块
  16. Axis2用法(1)JAVA2WSDL和WSDL2JAVA
  17. perspective
  18. 安防工程商选择千兆POE交换机的注意事项
  19. 100个基本 自我更新指南
  20. 黑基网博客——网络安全、工具软件、无线智能设备、编程开发、网赚分享与交流基地

热门文章

  1. Python——雅克比迭代求线性方程组的根
  2. 虽然这样解释有点污,但是秒懂(23 种设计模式)
  3. 三步就好,使用万用表来判断MOS管的好坏
  4. 《Linux/UNIX OpenLDAP实战指南》——1.8 自动化运维解决方案
  5. 关于JAVA导出word或者excel文件中文乱码问题解决
  6. mysql5.6.17编译 安装
  7. MySQL 手动主从同步不锁表
  8. Ubuntu 19.04(Disco Dingo)将采用 Linux 5.0 内核
  9. Cocos2dx在ios上多点触摸失效
  10. 47天21家面试,半年空挡期觉得整个人生都被毁了