计网——传输层TCP、UDP协议重点

传输层基本概念

  位于OSI协议栈的第四层——传输层,是唯一负责总体数据传输和数据控制的一层,传输层提供端到端的交换数据机制,不仅对上三层提供可靠的传输服务,还对网络层提供可靠的目的地信息。网际层提供的服务是主机间的逻辑通道,通过寻址,将数据包从一个主机发送到另一个主机上,但是如果有多个进程在运行,如何区分发送给哪个进程呢,这也就是传输层所提供的服务。传输层提供服务作用如下:

  • 为网络应用程序提供接口;
  • 为端到端连接提供流量控制、差错控制等管理服务;
  • 提供多路复用、多路分解机制。

面向连接和无连接

  针对不同的实际需求下传输层有两种数据传输协议类型:面向连接和无连接类型
面向连接
面向连接就是在通信双方在通信时要先建立一条通信线路,然后进行通信,其过程分为三个阶段,第一阶段是建立链接第二阶段是连接成功后进行数据传输第三阶段是数据传输后断开链接。可以联系我们生活中的打电话,当你拨号后服务商回为你分配一条专属链路,在过程中他不会被别人使用,但是当你挂掉电话的时候该链路可重新分配给其他人使用,是一种可靠的服务类型
无连接
  无连接是指通信双方不需要实现建立通信线路,而是把每个带有目的地址的包发送到线路上,有系统选定路线进行传输,不需要目标方进行回复。可联系到我们生活中的快递,每个包裹被贴上信息后发出,但是不一定会可靠的到达,没有专属的传输通道,因此会存在丢包的现象,是一种不可靠的服务类型

端口和套接字

  为了区分同一主机上不同应用程序的数据包,传输层提供了端口和套接字的概念:
端口的作用:在数据链路层中,通过MAC地址来寻找局域网中的主机;在网络层中通过IP地址来寻找网络中互联的主机或路由器;在传输层中则通过端口号寻址,用来识别同一计算机中的不同应用程序。
套接字:应用层通过传输层进行数据通信时,TCP和UDP会同时位多个应用进程提供并发服务,操作系统位应用程序和TCP/IP协议间的交互提供了一种套接字(socket)的接口,用来区分不同程序间的通信和连接。例如套接字地址为:192.168.75.128:22,则表示指向IP地址为192.168.75.128主机的22号端口。

多路复用和多路分解

  上面说到为了在一台主机上同时运行多个网络程序,操作系统提供了套接字,而多路复用:从源主机的不同套接字中收集数据块,并为每个数据块封装首部信息,从而生成报文段,然后将报文段传递到网络层中;多路分解:将传输层报文段中的数据交付到正确的套接字。

TCP协议

  TCP(Transmission Control Protocol)即传输控制协议是一种面向连接的可靠的、基于字节流传输层的通信协议,在CTP协议中通过三路握手建立链接,通信结束后通过四路挥手断开链接,若在数据包发送过程中因某种原因没有到达目的主机,将会重新发送。TCP协议的作用如下:

  • 面向流的处理:TCP以流的方式处理数据,其可以一个字节一个字节地接收数据,然后将接收到的数据组成长度不等的段在传递到网络层;
  • 重新排序:如果数据没有按照指定的顺序到达目的主机TCP可以对其重新排序恢复原始数据;
  • 流量控制:TCP能够确保数据传输不会超过目的主机的接收数据能力;
  • 优先级与安全:为TCP连接设置可选的优先级和安全级别;
  • 适当的关闭:以确保所有数据被接受和发送后再关闭连接。

TCP报文格式

  TCP报文格式如下图所示:
在这里插入图片描述

  1. 源端口和目的端口:TCP源端口(Source Port)表示源主机上的应用程序端口号占16位,TCP目的端口(Destination Port)表示目的主机的应用程序端口号占16位;
  2. 序列号:(Sequence Number)占32位,他表示本报文发送数据的第一个字节的编号,在TCP链接中,所传送的字节流每个字节中都会按照顺序编号,当SYN(同步序列号)标记不为1时则这是当前数据分段的第一个字母序列号;当SYN为1时这个字段的值就是初始序列值(ISN),用于对序列号进行同步,此时第一个字节的序列号比这个字段值大1也就是ISM加1;
  3. 确认号:(Acknowledgment Number,ACK Number)占32位,他表示接收方期望收到发送发下一个报文的第一个字节数据的编号,其值为接收计算机及将接收到的下一个序列号;
  4. 数据偏移:占4位,用来确定TCP数据段头部分的长度,告诉接收端的应用程序,数据从何处开始;
  5. 保留:(Reserved)占4位,位TCP将来发展预留空间,目前需要为0;
  6. 标志位
    URG(Urgent):表示本报文段中发送的数据是否包含紧急数据,当URG=1时表示有紧急数据,应当尽快传送;
    ACK:表示前面的确认号字段有效,TCP中规定建立连接后ACK必须为1;
    PSH(Push):告诉对方收到该报文后是否应立即推送给上层,若该值为1,则应当立即提交给上层,而不是缓存;
    RST:表示是否重置链接,若RST=1则说明此时链接发生错误应当释放,重新链接;
    SYN:在建立链接时使用,用来同步序列,当SYN=1,ACK=0 时,表示这是一个请求建立连接的报文段;当 SYN=1,ACK=1 时,表示对方同意建立连接。只有在前两次握手中SYN才为1;
    FIN:标记数据是否发送完成,若FIN=1,则表示数据已经发送完成,可释放连接;
  7. 窗口大小:窗口大小(Window Size)占16位他表示从ACK Number开始还可接收多少字节数据量,也可表示当前接收端的接收窗口剩余多少空间,用来完成TCP流量控制;
  8. TCP 校验和:(TCP Checksum)占16位,用来确认传输的数据是否有损坏,在发送端基于数据内容生成一个数值,接收端通过数据校验生成一个值若两值相同则数据无误,若不同则丢弃;
  9. 紧急指针:(Urgent Pointer)占16位仅当前面的URG控制位为1时才有意义,指出本数据段中为紧急数据的字节数,紧急数据处理完后恢复正常操作;
  10. 可选项:(Option)长度不定,但必须为32bits整数倍。

TCP连接控制机制

TCP建立连接:三次握手

在这里插入图片描述
图片来源:计算机网络知识总结
TCP三次握手过程

  1. 客户端发送SYN给服务器,表示客户端向服务器请求建立链接
  2. 服务器端收到客户端的SYN,并回复SYN+ACK给客户端(同意建立链接);
  3. 客户端收到来自服务器端的SYN+ACK后,回复ACK给服务器端(表示客户端收到了同意链接报文);
  4. 服务器端收到客户端的ACK,连接已建立,可进行数据传输

TCP三次握手过程解释:

  1. 客户端发送连接请求报文,报文首部的同步为SYN=1,同时选择一个初始学号seq=x,在TCP中,SYN报文段不可携带数据,但要消耗一个序号,此时客户端进程进入同步已发送状态(SYN-SENT);
  2. 服务器在接收到连接请求报文后,若同意链接则向客户端确认,在确认报文中吧SYN和ACK标志位都设为1,确认号为ack=x+1,同时也给自己选一个初始序号seq=y,该报文段也不可携带数据,需要消耗一个序号,此时服务器进入到同步收到(SYN-RECV)状态;
  3. 客户端在收到服务器的确认后还要给服务器发送确认,确认报文段的ACK位置为1,确认号ack=y+1,而自己的序号seq=x+1,在TCP中ACK报文段可携带数据,若不携带数据则不消耗序号,这样的情况下,下一个数据报的序号仍为seq=x+1,此时TCP链接已建立,客户端进入已建立连接(ESTABLISHED)状态,服务器在接到客户端的确认后也会进入已建立连接(ESTABLISHED)状态。

  Q1:TCP为什么要进行三次握手?

  1. 因为信道的传输是不可靠的,TCP协议正是在不可靠的信道上建立可靠的传输,则三次握手通信是理论上的最小值;
  2. 因为双方都需要对方收到了自己发送的序列号,确认对少要通过三次通信;
  3. 为了防止已失效的连接请求报文又传送到了服务器端而产生了错误。

TCP断开连接:四次挥手

在这里插入图片描述
图片来源:计算机网络知识总结
TCP四次挥手过程:

  1. 客户端发送FIN给服务器,此时客户端不需要发送数据给服务器端了请求释放连接
  2. 服务器端收到客户端的FIN,并回复ACK给客户端同意释放连接
  3. 客户端收到服务器端回复的ACK,此时客户端到服务器端的连接已释放,但服务器到客户端的连接还存在,客户端仍可接收数据;
  4. 服务器端发送数据给客户端;
  5. 当服务器端发送FIN+ACK给客户端时说明服务器端发送完了数据,请求释放服务器到客户端的连接,若没回复也会自动释放;
  6. 服务器端收到客户端的ACK后,断开服务器端到客户端的连接

TCP四次挥手过程解释:

  1. 建立连接后客户端和服务器端都处于ESTABLISHED状态,首先客户端的应用进程向其TCP发送请求释放连接报文,停止发送数据,其报文首部的FIN置1,其序列号seq=u,其等于前面发送的数据最后一个字节的序号加一,此时客户端进入进入中止等待1状态(FIN-WAIT-1),等待服务器端的确认,TCP中的FIN报文即使不携带数据也会消耗一个序号;
  2. 服务器端在接到连接释放报文后会发出确认,即ack=u+1,也会发送自己的序列号seq=v,即为服务器传送数据最后一个字节的序号加一,此时服务器端进入关闭等待状态(CLOSE-WAIT),TCP服务器进程已通知高层释放了连接,此时TCP处于半关闭状态,但服务器端到客户端的连接未关闭仍会持续一段时间;
  3. 客户端收到服务器端的确认后,进入种植等待2(FIN-WAIT-2)状态,等待服务器端发出请求释放报文,服务器端发出连接释放报文必须FIN=1,因为在半关闭状态下服务器端仍可发送数据,其序列号seq=w,服务器端仍需重复发送上次的确认号ack=u+1,此时服务器端进入最后确认状态(LAST-ACK),等待客户端的确认;
  4. 客户端在接收到服务器端的释放连接请求报文后,需要对此发出确认,其ACK置为1,确认号ack=w+1,字节的序号为seq=u+1(FIN会消耗一个序号),经过等待计时器(TIME-WAIT)设置的时间2MSL后,客户端会进入CLOSED状态,此MSL为最长报文段寿命,为了保证客户端发送的最后一个ACK报文可到达服务器端,若未成功到达,服务器则会重传FIN+ACK。

  Q2:TCP为什么要进行四次挥手?
  TCP为全双工模式,客户端请求关闭连接后(一二次挥手),服务器端可能会继续传输之前没传输玩的数据给客户端,然后服务器端请求到客户端的连接断开(三四次挥手),所以释放连接时的ACK和FIN要分开发送,中间还有数据发送,而在建立连接时ACK和SYN时一起发送的。

TCP连接同时打开和同时关闭

  在现实中还有一种情况就是可能两台主机同时执行打开连接和同时关闭连接的操作,虽然发生可能较低,但这样的流程就会略有不同,下面我们对同时打开(simultaneous open)连接和同时关闭(simultaneous)讨论:
同时打开:是指通信双方在接收到SYN包前,都主动执行打开操作并发出自己的SYN包,虽然在实际情况中少见,其示意图如下:
在这里插入图片描述
  其与三次握手的主要区别如下:

  • 两台主机同时执行打开操作;
  • 两端的状态变化都是由CLOSED -> SYN_SENT -> SYN_RCVD -> ESTABLISHED
  • 建立链接需要四个数据包交换,且每个数据包都有SYN,知道收到SYN的ACK。

同时关闭:同时关闭类似于四次挥手,但是状态转换略有不同,同时关闭是由ESTABLISHED -> FIN_WAIT_1 -> CLOSING -> TIME_WAIT -> CLOSED,示意图如下:
在这里插入图片描述

TCP流量控制机制

滑动窗口机制

数据分片
  其实客户端和服务器端间的通信就是数据传输的过程,其通信的数据以数据报的形式传输,而为了更有效地通信TCP采用滑动窗口机制发送多个数据包,当数据包丢失时,TCP可以利用重发功能重新发送,而若接收主机接受能力不匹配,TCP又可根据接受能力发送适当的数据包。
  首先在IP层我们介绍了数据包如果超过了一定的限制(UDP和TCP限制不同)在路由器经过路由器网关等设备时会被分片,前面说到过如果是UDP协议,则会通过设置MTU(最大传输单元),而在TCP协议中我们会设置MSS(Maximum Segment Size)即最大字节数来限制,其值一般为MTU - TCP首部20字节 - IP首部20字节。在第一次握手和第二次握手包的TCP首部会包含MSS选项,用来告知网络接口可适应MSS大小,然后会选用较小的MSS值传输。
滑动窗口
  在数据传输时若数据较大则需要分为多个数据包发送,TCP协议需要确认数据无误后才可发送下一个数据包,如下图所示:
在这里插入图片描述
  但这样的话每发送一个数据包都需要确认这样就浪费了很多时间,而TCP窗口就是为了避免这样的情况,窗口大小指不需要等待确认应答包而可继续发送数据包的最大值,下图为窗口为3的传输示意图:
在这里插入图片描述
  以这样的方式可省去多个数据报的的应答,避免降低网络吞吐量。
  窗口大小指的是可以发送数据包的最大数量,而在使用中可分为两部分,第一部分为数据包已发送,但未得到确认应答包,第二部分为允许发送,但还未发送的数据包,当发送了最大数量的数据包时,又是不会同时受到这些数据报的确认应答,而是收到了部分应答,为此可采用滑动窗口的方式,向后移动,确保下次仍可发送窗口大小的数据包,设窗口大小为3,示意图如下:
在这里插入图片描述
  当发送端发送了 3 个数据包(2001-5000),接收应答确认包为“下一个发送4001”此时表示成功收到前两个数据包,最后一个没有相应则把下一个数据包保留到窗口中。
数据重发
  在数据包传输中,难免会丢失数据,这样的情况分为两种:

  1. 若未使用滑动窗口,发送的数据包未收到确认应答包,则数据都会被重发;若采用了滑动窗口,机是确认应当包丢失,则不会导致全部重发;
  2. 发送的数据包丢失,倒是数据包重发。

 具体解决方法滑动窗口机制

TCP拥塞控制

  拥塞控制时防止过多的数据注入网络中,可使网络中的路由器或链路不过载有以下四种解决方法:慢启动( slow-start )、拥塞避免( congestion avoidance )、快重传( fast retransmit )、快恢复( fast recovery )。

TCP计时器

  TCP中有四种计时器(Timer),分别为:重传计时器(Retransmission Timer)、坚持计时器(Persistent Timer)、保活计时器(Keeplive Timer)、时间等待计时器(Timer_Wait Timer)。

UDP协议

  UDP(User Datagram Protocol)即用户数据协议,是一种传输层协议,在TCP/IP网络中,他与TCP协议一样用来处理数据包是无连接的协议;
  TCP的处理虽然可靠且安全,但效率较低,UDP是一种没有复杂控制,提供面向无连接的通信服务协议。其具有以下特点:

  • 没有各种链接,因此不用请求建立和断开链接;
  • 不可重新排序,对于到达顺序混乱的数据包不会重新排序;
  • 没有确认机制,发送数据包后无需等待对方确认,因此UDP可随时接收发送数据,无法保证成功被目的主机接收。

UDP报文格式

  UDP报文被分为UDP报头和UDP数据两部分,报头由4个16位长(2字节)的字段组成,分别为源端口、目的端口、长度和校验值,如下图所示:
在这里插入图片描述

  • 源端口:该字段占UDP报头前16位,包含使用UDP应用程序的端口,该字段可选择即发送端不一定将端口写入该字段,即设置为0,接收端的应用程序不会发送响应;
  • 目的端口:目的主机使用UDP的端口,占16位;
  • 长度:占16位,表示UDP数据包长度,包含UDP报文头和UDP数据长度,该值最小为8(报文头长度);
  • 校验值:占16位,可以校验数据在传输过程中是否被破坏。

TCP和UDP区别

  • TCP提供可靠的面向连接服务,通过TCP的数据传输无差错,不丢失,会按序到达,而UDP是无连接的不保证可靠交付的;
  • TCP的逻辑通信信息是全双工的可靠信息;UDP则是不可靠信息;
  • 每一条TCP连接只能是点对点的;UDP支持一对多、多对一、多对多的交互通信;
  • TCP面向字节流即可能出现粘包问题,UDP面向报文的不会出现粘包问题;
  • UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低;
  • TCP首部开销20字节;UDP的首部开销小,只有8字节。
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值