TCP/IP学习之路(六)

在开始讨论TCP和UDP前,我们先看一下传输层相关知识。
为什么需要传输层:在TCP/IP的通信当中,传输层需要指出这个具体的程序是什么,为了实现这一功能,使用端口号这样一种识别码,根据端口号就可以识别在传输层上一层的应用层中所要进行处理的具体程序。

TCP和UDP

  • TCP
    TCP是面向连接的,可靠的流协议。流是指不间断的数据结构,当应用程序采用TCP发送消息时,虽然可以保证发送的顺序,但还是犹如没有任何间隔的数据流发送给接收端。TCP为了提供可靠性传输,实行“顺序控制”或“重发控制”机制。此外还有“流控制(流量控制)”,“拥塞控制”,提高网络利用率等众多功能。
  • UDP
    UDP是不具有可靠性的数据报协议。细微的处理它会交给上层的应用去完成。在UDP的情况下,虽然可以确保发送消息的大小,却不能保证消息一定会到达。因此,应用有时候会根据自己的需要进行重发。

TCP和UDP的区分:TCP主要用于可靠性传输,即实现顺序控制和重发控制。而UDP则是用于那些对高速传输和实时性有较高要求的通信或广播通信。一般在多播和广播中使用UDP,例如RIP协议和DHCP协议都依赖UDP。

套接字(socket):应用在使用TCP和UDP时,会用到操作系统提供的类库。这种类库一般被称为API(应用编程接口)。使用TCP和UDP通信时,又会广泛使用到套接字的API。利用套接字可以设置对端的IP地址,端口号,并实现数据的发送和接收。

端口号定义:在传输层中也有这种类似于地址的概念,那就是端口号。端口号用来识别同一台计算机中进行通信的不同应用程序。因此,它也被称为程序地址。

详细介绍TCP

  • TCP的特点及其目的:为了通过IP数据报实现可靠性传输。TCP通过检验和,序列号,确认应答,重发控制,连接管理以及窗口控制等机制实现可靠性传输。
  • 通过序列号与确认应答提高可靠性:如果单纯的只用ACK(确认应答)来判断数据包是否发送成功,可能导致的问题就是:一旦ACK丢失,源主机还是以为包没发送成功又发一次,或者ACK延迟到达也会导致。为了避免目标主机重复收到数据包。TCP通过序列号来实现。序列号是按顺序给发送数据的每一个字节都标上号码的编号。接收端查询接收数据TCP首部中的序列号和数据的长度,将自己下一步应该接受的序号作为确认应答返送回去。就这样,通过序列号和确认应答号,TCP可以实现可靠传输。
  • 重发超时如何确定:TCP在每次发包时都会计算往返时间及其偏差。将这个往返时间和偏差相加,重发超时的时间就是比这个总和要稍大一点的值。在BSD的Unix以及Windows系统中,超时都以0.5秒为单位进行控制,因此,重发超时都是0.5秒的整数倍。不过,由于最初的数据包还不知道往返时间,所以其重发超时一般设置为6秒左右。数据被重发之后若还是收不到确认应答,则进行再次发送。此时,等待的时间将会以2倍,4倍的指数函数延长。但是,数据也不会被无限,反复地重发。达到一定重发次数之后,如果还是没有收到确认应答。就会判断网络或对端主机发生了异常,强制关闭连接。并通知应用通信异常强行终止。
  • 连接管理:一次TCP 完整连接的建立和断开,至少需要来回发送7个包含控制的字段来实现。大致如下:
    CLIENT-------------------->SYN------------------------->SERVER(请求建立连接)
    CLIENT<--------------------ACK,SYN<---------------------SERVER(针对SYN的确认应答,请求建立连接)
    CLIENT-------------------->ACK------------------------->SERVER(针对SYN的确认应答)
    CLIENT-------------------->FIN------------------------->SERVER(请求断开连接)
    CLIENT<--------------------ACK<-------------------------SERVER(针对FIN的确认应答)
    CLIENT<--------------------FIN<-------------------------SERVER(请求切断连接)
    CLIENT-------------------->ACK------------------------->SERVER(针对FIN的确认应答)
    建立连接的过程需要发送三个包,这个过程也叫作“三次握手”。
  • TCP以段为单位发送数据:在建立TCP连接的同时,也可以确定发送数据包的单位,我们也可以称其为“最大消息长度”(MSS)。最理想的情况是,最大消息长度正好是IP中不会被分片处理的最大数据长度。
  • 利用窗口控制提高速度:为了解决每发一个段进行一次确认应答有点麻烦且性能较差的问题,引入了窗口控制,即源主机发送一个段以后不必要一直等待确认应答,而是继续发送。窗口大小就是指无需等待确认应答而可以继续发送数据的最大值,这个机制实现使用了大量的缓冲区,通过对多个段同时进行确认应答的功能。收到确认应答的情况下,将窗口滑动到确认应答中的序列号的位置,这样可以顺序地将多个段同时发送提高通信性能。这种机制也被称为滑动窗口控制。
  • 窗口控制与重发控制:窗口控制中如果出现段丢失的情况:1,确认应答丢失:可以通过下一个确认应答来进行确认上一个包有没有发送成功。2,报文段丢失:当某一报文段丢失后,发送端会一直收到序号为那个报文段的序号的确认应答,如果连续3次收到相同的确认应答,就会将其所对应的数据进行重发。由于比超时控制更有效,所以也被称为高速重发控制。
  • 流控制:发送端根据自己的实际情况发送数据,但是,接收端很可能收到的是一个毫无关系的数据包又可能会在处理其他问题上花费一些时间。因为这个数据包在处理上需要点时间,甚至高负荷情况下无法接收任何数据。这样会造成数据重发,不必要的网络流量。为了解决这个问题,TCP提供了一种可以让发送端根据接收端的实际接收能力控制发送的数据量的机制。这就是所谓的流控制。当接收端的缓冲区一旦面临数据溢出时,窗口大小的值也会随之被设置为一个更小的值给发送端,以达到控制数据发送量。
  • 拥塞控制:窗口控制固然是个好东西,但是,如果在通信刚开始时就发送大量数据,由于计算机都处在一个共享的环境,因此有可能会造成网络拥堵。为了避免此问题,TCP在通信一开始就会通过一个叫做慢启动的算法得出的数值,对发送数据量进行控制。先了解一下什么叫拥塞控制,为了在发送端调节所要发送的数据量,定义了一个叫做“拥塞窗口”的概念。在慢启动的时候,将这个拥塞窗口的大小设置为1个数据段发送数据。之后没收到一次确认应答,就+1。再将拥塞窗口的值与通知的窗口大小作比较,取小的值,以更小的数据量发送。不过,随着包的每次往返,拥塞窗口也会以1,2,4等指数函数的增加,拥堵状况激增甚至导致网络拥堵。为了防止这些,引入了慢启动阈值的概念。只要超过这个阈值,只允许按照某种比例放大拥塞窗口。但通信一开始没有设置阈值,只有超时重发时,才会设置为当时拥塞窗口的一半大小。

介绍两种提高网络利用率的规范:1.Nagle算法:该算法是指发送端即使还有应该发送的数据,但如果这部分数据很少的话,则进行延迟发送的一种处理机制。具体来说就是以下两种条件满足一条才能发送。①:已发送的数据都已经收到确认应答时②:可以发送最大段长度的数据时。2.延迟确认应答:①在没有收到2x最大段长度的数据为止不做确认应答。②其他情况,最大延迟0.5秒发送确认应答(很多OS设置为0.2秒)3.捎带应答:确认应答和回执数据可以通过一个包发送,为了使收发数据量减少。但是,接受数据如果立即返回确认应答,就无法实现捎带应答,必须先传给应用处理完才能发送,所以,同样需要开启延迟确认应答。

总的来说,如果需要应用自己处理一些更为细节上的控制,就用UDP。如果转发数据量较多,对可靠性要求高,可以选用TCP。

TCP首部

在这里插入图片描述

UDP首部

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值