本文记录了阅读《图解TCP/IP》的《TCP与UDP》章节的笔记。

一、传输层的作用

当IP协议根据IP地址发送数据到了目标计算机上,但是具体要发给哪个应用程序还没有确定。传输层就用来确定具体的应用程序,也就是确定了端口号

TCP/IP具有两个有代表性的传输层协议,分别是TCPUDP。TCP提供可靠的通信传输,UDP常被用于让广播和细节控制交给应用的通信传输。根据通信的具体特征,选择合适的传输层协议是非常重要的。

IP首部有一个协议字段,标识IP层的上一层使用了什么传输层协议,可以通过该字段识别IP传输的数据是TCP还是UDP。

传输层的作用

二、UDP(User Datagram Protocol)

UDP是不可靠数据报协议。它不提供复杂的控制机制,细微的处理会交给上层应用完成。在接到应用程序发来数据的一刻,立即按照原样发送到网络上。虽然可以确保发送消息的大小,却不能保证消息一定会到达。因此应用需要根据自己的需要进行重发处理。

适用于:包总量较小(DNS、SNMP),视频、音频等多媒体(即时通信),限定于LAN等特定网络中的应用通信,广播通信(广播、多播)

UDP首部组成有:源端口号,目标端口号,包长度,校验和。

三、TCP(Transmission Control Protocol)

面向连接的、可靠流协议。流是指不间断的数据结构。应用程序用TCP发送消息,虽然可以保证发送的顺序,但还是犹如没有任何间隔的数据流发送给接收端。TCP为提供可靠性传输,实行顺序控制重发控制机制,还具备流控制拥塞控制提高网络利用率等众多功能。

连接是指:各种设备、线路、网络中进行通信的两个应用程序为了相互传递消息而专有的、虚拟的通信线路,也叫做虚拟电路。一旦建立了连接,进行通信的应用程序只会使用这个虚拟的通信线路发送、接收数据,就可以保障信息的传输。应用程序可以不用顾虑IP网络上可能发生的各种问题,依然可以转发数据。TCP则负责控制连接的建立、断开、保持等管理工作。

TCP通过检验和序列号确认应答重发控制连接管理窗口控制等机制实现可靠性传输(包括数据的破坏、丢包、重复、分片顺序混乱等)。

1 确认应答和序列化

在TCP中,发送端的数据到达接收主机时,接收端主机会返回一个已收到消息的通知,也叫确认应答(ACK),发送端如果收到了ACK就不会再发送消息,如果在一定时间内没有收到则会重复发送。

未收到确认应答并不意味着数据丢失,也有可能是数据已经收到,只是返回的确认应答丢失。这种情况也会导致发送端因没有收到ACK,认为数据没有送达,从而重新发送。

还有一些其他原因导致重复发送,有时会导致目标主机重复收到相同数据。这时就需要有一种序列号机制能判定是否已经接收该数据。

序列号是按顺序给发送数据的每一个字节都标上号码的编号,接收端查询接收数据TCP首部中的序列号和数据长度,将自己下一步应该接收的序号作为确认应答返回。这样通过序列号和确认应答号,TCP可以实现可靠性传输

序列号机制

2 重发超时如何确定

重发超时是指,等待一定时间后,还没有接收到确认应答。那么这里的等待时间如何确定

这个时间随着网络环境的不同应该有所变化,例如高速LAN可能较短,长距离通信可能较长,不同拥塞程度也不一样。所以在每次发包的时候都需要计算往返时间及其偏差,两值的和就应该稍小于重发超时的时间。故有:

重发超时时间

在最初,由于不知道往返时间,所以会设定为较大值,一般为6s。如果多次发送都得不到应答,应答时间会成倍增长,不过也会有一个限度,到达限度后就不会再重发,会关闭连接。

3 连接管理

这里也就是说为什么TCP至少需要7次通信:3次握手和4次挥手。

握手 和 挥手

三次握手:

  1. 客户端向服务器发出连接请求报文,将 SYN 标识位置为 1,Sequence Number 置为x(TCP规定SYN=1时不能携带数据,x为随机产生的一个值),然后进入SYN_SEND状态。
  2. 服务器收到请求报文后,如果同意连接,则发出确认报文。确认报文中应该 ACK=1,SYN=1,确认号是 ack=x+1,同时也要为自己随机初始化一个序列号 seq=y,此时,TCP服务器进程进入了SYN-RCVD(同步收到)状态。这个报文也不能携带数据,但是同样要消耗一个序号。这个报文带有SYN(建立连接)和ACK(确认)标志,询问客户端是否准备好。
  3. 客户端进程收到确认后,还要向服务器给出确认。确认报文ACK=1,确认号ack=y+1,此时,TCP连接建立,客户端进入ESTABLISHED(已建立连接)状态。

四次挥手:

  1. 客户端发出连接释放报文(FIN),并停止发送数据,此时,客户端进入FIN-WAIT-1(终止等待1)状态。
  2. 服务端发回一个ACK(确认),确认收到序号为收到序号+1,和SYN一样,一个FIN将占用一个序号,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
  3. 服务端发送一个FIN(结束)到客户端,服务端关闭客户端的连接。
  4. 客户端发送ACK(确认)报文确认,并将确认的序号+1,这样关闭完成。此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。服务器结束TCP连接的时间要比客户端早一些。

4 以段为单位发送数据

在建立TCP连接时,需要确定最大消息长度(MSS,Maxium Segment Size),理想的情况是该长度正好是IP中不会分片处理的长度

TCP传输大量数据时,以MSS大小分割发送。MSS在三次握手中计算得出,是取两台机器的TCP接口能适应的MSS大小的较小值。即

确定MSS

5 用窗口控制提高速度

TCP每次发送都需要进行确认应答,该方式的缺点是,包的往返时间越长,通信性能越低。

单次确认

为了解决这个问题,TCP引入了窗口的概念。确认应答不再以段为单位,而是以更大的单位进行确认,转发时间就会被大幅缩短。该机制需要使用一些缓冲区实现对多个段同时进行确认应答。

窗口确认

如果窗口控制中出现段丢失怎么办?

  • 如果只是应答丢失无需重发数据;
  • 如果是数据丢失,则会在应答中要求重发数据。
数据丢失 和 应答丢失

TCP适用于传输层有必要实现可靠传输的情况,由于它面向有连接并具备顺序控制、重发控制,所以可以提高可靠传输。UDP用于对高速传输和实时性有高要求的通信或广播通信。例如打电话时,如果用TCP,数据在中途会丢失或重发,就无法流畅的传输童话人的声音;而用UDP,不会重发,就不会有声音大幅延迟到达,即使有数据丢失,也只会影响到一小部分的通话。

套接字:应用在使用TCP或UDP时,会用到操作系统提供的类库,会广泛使用到套接字(socket)的API。应用程序利用套接字可以设置对端的IP地址、端口号,并实现数据的发送与接收。

套接字

6 拥塞控制

有了 TCP 的窗口控制,收发主机之间即使不再以一个数据段为单位发送确认应答,也能够连续发送大量数据包。然而,如果在通信刚开始时就发送大量数据,也可能会引发其他问题。一般来说,计算机网络都处在一个共享的环境,因此也有可能会因为其他主机之间的通信使得网络拥堵。在网络出现拥堵时,如果突然发送一个较大量的数据,极有可能会导致整个网络的瘫痪

TCP 为了防止拥塞问题的出现,在通信一开始时就会通过一个叫做慢启动的方法,对发送数据量进行控制。

拥塞控制 和 慢启动

7 TCP首部

TCP首部比UDP首部复杂得多。首部中没有包长度和数据长度,这里可以由IP层获取TCP的包长度,由TCP包长度可知数据长度。

  • 序列号 (Sequence number),这个序号保证了 TCP 传输的报文都是有序的,对端可以通过序号顺序的拼接报文
  • 确认号 (Acknowledgement Number),这个序号表示数据接收端期望接收的下一个字节的编号是多少,同时也表示上一个序号的数据已经收到
  • 窗口大小 (Window Size),表示还能接收多少字节的数据,用于流量控制
  • 标识符
  • ACK=1 :该字段为一表示确认号字段有效。此外,TCP 还规定在连接建立后传送的所有报文段都必须把 ACK 置为一。
  • SYN=1:当SYN=1,ACK=0时,表示当前报文段是一个连接请求报文。当SYN=1,ACK=1时,表示当前报文段是一个同意建立连接的应答报文。
  • FIN=1:该字段为一表示此报文段是一个释放连接的请求报文。
  • URG=1 : 该字段为一表示本数据报的数据部分包含紧急信息,是一个高优先级数据报文,此时紧急指针有效。紧急数据一定位于当前数据包数据部分的最前面,紧急指针标明了紧急数据的尾部。
  • PSH=1 :该字段为一表示接收端应该立即将数据 push 给应用层,而不是等到缓冲区满后再提交。
  • RST=1:该字段为一表示当前 TCP 连接出现严重问题,可能需要重新建立 TCP 连接,也可以用于拒绝非法的报文段和拒绝连接请求。

四、其他传输层协议

在互联网中,很长一段时间传输层都是使用TCP和UDP,然而还有一些其他协议也有被提出。

1 UDP-Lite

UDP-Lite(Lightweight User Datagram Protocol,轻量级用户数据报协议)是扩展UDP机能的一种传输层协议。在UDP通信中,如果check sum出现错误,所收到的包将被全部丢弃。然而现实操作中有些应用在面对这种情况时并不希望全部丢弃

比较简单的想法是直接不检验校验和,但是这种方式如果是首部被破坏,那就会产生安全问题,所以不能直接将校验和去掉。UDP-Lite也就是来处理这种问题。

UDP-Lite于UDP几乎相同,不过check sum的范围可以由用户自行决定,有多种情况:

  • 包+伪首部
  • 首部+伪首部
  • 首部+伪首部+数据的一部分

有了这种机制,就可以对数据中不允许发生错误的部分进行检查;对其他部分即使出错也可以忽略不计

2 SCTP

SCTP(Stream Control Transmission Protocol,流控制传输协议)与TCP一样,都是对一种提供数据到达与否相关可靠性检查的传输层协议。主要特点有:

  • 以消息为单位收发:TCP中接收端并不知道发送端应用所决定的消息大小。在SCTP中却知道。
  • 支持多重宿主:在有多个NIC的主机中,即使其中能够使用的NIC发生变化,也仍然可以继续通信。
  • 支持多数据流通信:TC中建立多个连接才能进行通信的效果,在SCTP中一个连接就可以。
  • 可以定义消息的生存期限:超过生存期限的消息不会被重发。

SCTP主要用于进行通信的应用之间发送众多小消息的情况,这些较小的应用消息被称为数据块(Chunk),多个数据块组成一个数据包

此外SCTP具有支持多重宿主以及设定多个IP地址的特点。多重宿主是指同一台主机具备多种网络的接口。例如笔记本电脑可以连接以太网(网线)也可以连无线LAN(WIFI)。

同时使用以太网和无线LAN,各自的NIC会获取到不同的IP地址。如果在进行TCP通信时,中间有网络切换,则连接就会中断。然而在SCTP情况下,由于可以管理多个IP地址使其同时进行通信,因此即使出现通信过程中有连接切换,也能保持通信不中断。所以SCTP可以为具备多个NIC的主机提供更可靠的传输。

3 DCCP

DCCP(Datagram Congestion Control Protocol,数据报拥塞控制协议)是一个辅助UDP的崭新的传输层协议。UDP没有拥塞控制机制,因此在使用UDP传输大量数据包时容易出现问题。互联网中的通信,即使使用UDP也应该控制拥塞。而开发人员很难将这个机制融合到协议中,于是便出现了DCCP这样的规范。它有以下特点:

  • 与UDP一样,不能提供可靠性传输。
  • 它面向连接,具备建立和断开连接的处理,在创建和断开连接上具有可靠性。
  • 能够根据网络拥堵情况进行拥塞控制,可以根据自身特点进行拥塞控制,有两种方法:类似TCP(TCP-Like)和TCP友好升级控制(TCP-Friendly Rate Control)。
  • 为了进行拥塞控制,接收端收到包以后返回确认应答ACK。该确认应答将被用于重发与否的判断。

的udp的接收端如何看速率_计算机网络 TCP与UDP相关推荐

  1. udp如何知道对方关闭_聊聊tcp和udp那些事

    "说起tcp/ip协议中最复杂的一个协议,我觉得非tcp协议莫属,tcp协议位于传输层,是传输层两个协议其中之一,另一个就是udp协议" 传输层位于应用层和网络层之间,是应用程序发 ...

  2. 宁波大学计算机网络,宁波大学计算机网络TCP与UDP题目

    波大计算机网络home work3 问题及解答: 1.端口(port)和套接字(socket)的区别是什么? 2.是否TCP和UDP都需要计算往返时间RTT? 3.在TCP传送数据时,有没有规定一个最 ...

  3. tcp udp区别优缺点_Linux网络编程面试题--tcp和udp的区别

    (1)TCP是基于连接的,UDP是基于无连接的. (2)TCP的数据是可靠的,UDP的数据是不可靠的. (3)TCP的数据是有序的,UDP的数据是无序的. (4)TCP不保存用户边界,UDP保存用户边 ...

  4. 计算机网络--TCP、UDP相关概念

    目录 一.TCP拥塞控制 几种拥塞控制的方法: (1)慢启动 (2)快速恢复 (3)快速重传 二.三次握手.四次挥手抓包 三.UDP 的编程流程 概念 部分代码 特点: 一.TCP拥塞控制 在计算机网 ...

  5. 计算机网络TCP与UDP的区别

    UDP协议: UDP是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无 ...

  6. tcp、udp协议连接的建立和释放

    tcp协议连接的建立和释放 一.tcp协议 (1)tcp的头部结构 (2)tcp的三次握手(重点) (3)tcp的四次挥手(重点) (4)tcp的状态转移图 (5)tcp可靠性的体现 二.UDP协议 ...

  7. 计算机网络协议(三)——UDP、TCP、Socket

    底层网络知识详解:最重要的传输层 概述 一.UDP协议 二.TCP协议(上) 2.1 TCP的三次握手 2.2 TCP的四次挥手 2.3 TCP状态机 三.TCP协议(下) 3.1 可靠传输 3.2 ...

  8. LINUX 下tcp 和 udp 套接字收发缓冲区的大小决定规则 .

    const int udp_recvbufsize = 384 * 1024 ; int result = ::setsockopt(m_hSocket, SOL_SOCKET, SO_RCVBUF, ...

  9. 4-1:TCP协议之传输层的作用及传输层协议TCP和UDP

    文章目录 一:传输层的定义 二:通信处理 三:传输层协议 四:TCP协议的可靠和性能 一:传输层的定义 前面说过,IP首部有一个协议字段用于标识网络层(IP)的上一层采用哪一种传输层协议.根据这个字段 ...

最新文章

  1. Matlab在概率统计中的应用问题及解决方案集锦
  2. Apache Log4j2,RASP 防御优势及原理
  3. tensorflow gpu利用率为0_训练效率低?GPU利用率上不去?快来看看别人家的tricks吧...
  4. 斯坦福所倡导的设计思维_针对高科技项目的有效开发商倡导
  5. yum nginx最新版安装
  6. Pytest之fixture
  7. Eclipse 使用常见问题汇总
  8. Nginx 安装与使用
  9. 损失函数与代价函数区别
  10. php设计模式 — 单例模式(singleton)
  11. 软件工程题库(荟萃)
  12. 统计学中sp_统计学中pssp是什么意思
  13. Windows下同步工具FastCopy
  14. Denoise-----去除噪声
  15. 以贝叶斯思维看待世界
  16. 百度大脑OCR助力泰康保险医疗理赔实现智能化
  17. python pandas如何实现类似于excel中left或者right函数
  18. 警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.ecli
  19. Crack:GrapeCity Documents for Excel 6.0.1
  20. 2018.07.18【2018提高组】模拟C组

热门文章

  1. sklearn中的Linear_model的score函数讲解
  2. 关于深度学习框架的一些见解
  3. js中遍历数组加到新数组_JS中的真伪数组
  4. java中for循环快捷方式_IntelliJ IDEA(快捷键):快速生成各种for循环(示例代码)...
  5. numpy数组与矩阵运算
  6. c语言代码re通常什么错误,C语言,realloc动态内存申请,出现报错double free or corruption (!prev)...
  7. python里边的单词都表示什么_Python:只保留字符串中的单词,每个单词都在newlin上...
  8. CentOS7安装Nginx,全网最快安装教程
  9. 换行与回车(\r \n)的起源以及在编制语言中的使用
  10. 前后端分离的用户验证原理及Spring Boot + JWT的框架搭建(附完整的框架代码)之二