C/C++教程

传输层(1) 概述 UDP协议 TCP协议

本文主要是介绍传输层(1) 概述 UDP协议 TCP协议,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一、传输层概述

  传输层使用网络层提供的服务,为应用层提供服务。

  

  传输层的功能

  (1)传输层提供进程和进程之间的逻辑通信。

  (2)复用和分用利用传输层的协议为多个应用程序提供服务。

  (3)传输层对收到的报文数据部分进行差错检验。

  (4)传输层有两个协议,分别是TCP和UDP协议。

 

  TCP协议:是面向连接的传输控制协议。传送数据之前必须建立连接,数据传输结束后要释放连接,不提供广播或多播服务,由于TCP要提供可靠的面向连接的传输服务,因此不可避免增加了开销,回复确认,流量控制、计时器、连接管理等。即可靠、面向连接、时延大,适用于可靠传输。

  UDP协议:无连接的用户数据报协议。传送数据之前不需要建立连接,收到UDP报文后也不需要给出任何确认。即不可靠,无连接,时延小,适用于不可靠传输。

  

  复用:应用层所有的应用进程都可以通过传输层协议传输到网络层。

  分用:传输层从网络层收到数据后交付指明的应用进程处理。

  

  端口:是传输层的SAP,标识主机中的应用进程。端口号只有本地意义,在因特网中不同计算机的相同端口是没有联系的。端口号长度为16bit,能表示65535个不同的端口号。

  端口号按范围分,可以分为服务端使用的端口号和客户端使用的端口号。

    服务端使用的端口号,可以分为系统端口号范围是 0 - 1023;登记端口号范围是1024 - 49151。

    客户端使用的端口号,仅在客户进程使用时才动态使用,范围是49152 - 65535。

  

  在网络中采用发送方和接收方的套接字组合来识别端点,套接字唯一标识了网络中的一个主机和它上面的一个进程。

    套接字 Socket = (主机IP地址,端口号)

 

二、UDP协议

  UDP只是在IP数据报服务之上增加了很少的功能,即复用分用和差错检测功能。

  

  UDP的主要特点

  (1)UDP的无连接的,减少开销和发送数据之前的时延。

  (2)UDP使用最大努力交付,即不保证可靠交付。

  (3)UDP是面向报文的,适合一次性传输少量数据的网络应用。

  (4)UDP无拥塞控制,适合很多实时应用。如IP电视、IP电话等。

  (5)UDP首部开销小,只有8B,而TCP 是20B。

  

  UDP的首部格式

    

  1、源端口号(16bit):本设备的应用进程的服务端口号。

  2、目的端口号(16bit):接收端的应用进程的服务端口号。

  3、UDP长度(16bit):整个UDP数据报的长度,即UDP首部+数据部分的长度。

  4、UDP检验和(16bit):检测整个UDP数据报是否有错,就错就丢弃。

  5、数据部分:用户存放用户传输的数据部分。

  注:当数据报文到达传输层,如果找不到对应的目的端口号,就丢弃报文,并给发送方发送ICMP端口不可达的差错报告报文。

  

三、TCP协议

  TCP协议的特点

  (1)TCP是面向连接(虚连接)的传输层协议。

  (2)每一条TCP连接都是点对点的。

  (3)TCP提供可靠交付的服务,无差错、不丢失,不重复、按序到达。

  (4)TCP提供全双工通信。

    发送缓存:准备发送的数据和已发送但尚未收到确认的数据。

    接收缓存:按序到达但尚未被应用程序读取的数据,不按序到达的数据。

  (5)TCP面向字节流,TCP把应用程序交下来的数据看成是一连串的无结构的字节流数据。

  

  TCP的报文首部格式

    

  TCP报文由两个部分组成,分别是TCP首部,TCP数据部分。TCP的首部长度为20字节,首部长度必须是4字节的整数倍,所以,在TCP首部还设置有填充字段,当TCP首部不足20字节时,在填充字段上填充全0数据。

  1、源端口(16bit):发送数据的应用进程服务端口。

  2、目的端口(16bit):接收数据的应用进程的服务端口。

  3、序号(32bit):在一个TCP连接中传送的字节流中的每一个字节都按顺序编号,本字段表示本报文段所发送的数据的第一个字节的序号。

  4、确认号(32bit):指期望收到对方下一个报文段的第一个数据字节的序号。若确认号为N,则证明序号N-1为止的所有数据都已正确接收。

  5、数据偏移(4bit):当TCP的首部不是固定的20B时,用于确定TCP首部的长度,TCP报文段的数据起始距离TCP报文段的起始处有多远,以4B为单位,即1 代表4B。

  6、6位的控制位(6bit)

    紧急位URG:当URG=1时,标明此报文段中有紧急数据,是高优先级的数据,应尽快传送,不用在缓存里排队,配合紧急指计字段使用。

    确认位ACK:当ACK=1时,确认号有效,在连接建立后所有传送的报文段都必须把ACK置为1。

    推送位PSH:当PSH=1时,接收方尽快交付接收应用进程,不再等到缓存填满再向上交付。

    复位RST:当RST=1时,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立连接。

    同步位SYN:当SYN=1时,表明是一个连接请求/连接接受报文。

    终止位FIN:当FIN=1时,表明此报文段发送方数据已发完,要求释放连接。’

  7、窗口(16bit):指的是发送本报文段的一方的接收窗口,即现在允许对方发送的数据量。

  8、检验和(16bit):检验首部+数据部分,检验时要加上12B伪首部,第四个字段为6。

  9、紧急指针(16bit):当URG=1时,紧急指针才有意义,指出本报文段紧急数据的字节数。

  10、选项(24bit):包含最大报文长度MSS、窗口扩大、时间戳、选择确认....等等。

  11、填充(8bit):如果选项不是4B的整数倍,则填充至4B的整数倍。

  

四、TCP连接管理

  TCP连接传输的过程需要经过三个阶段:

    分别是建立连接 -> 数据传送 -> 释放连接

    TCP连接的建立采用客户与服务器方式,主动发起建立连接的应用进程端称为客户,而被动等待连接建立的应用进程端称为服务器。

    

  TCP连接建立的过程

    当一台客户机的一个进程想与另一台服务器上的一个进程建立TCP连接,客户机应用进程先通知客户TCP,他想建立一个与服务器上某个进程之间的连接,客户中的TCP用通过以下步聚与服务器的TCP建立连接。

    

    (1)客户端发起连接请求报文段,无应用层数据。SYN = 1 (同步位),Seq = x (序号位)。

    (2)服务器端为该TCP连接分配缓存,并向客户端返回确认报文段,允许连接,无应用导数据。SYN = 1 (同步位),ACK= 1 (确认位),Seq = y   (序号位),ack = x + 1(确认号)。

    (3)客户端为该TCP连接分配缓存,并向服务器端返回确认信息,可以携带数据。SYN= 0 (同步位),ACK = 1 (确认位),Seq = x +1 (序号位),ack = y + 1(确认号)。

    注:SYN洪泛攻击

      SNY洪泛攻击发生在OSI第四层,这种方式利用TCP协议的特性,就是三次握手。攻击者发送TCP SYN,SYN是TCP三次握手中的第一个数据包,而当服务器返回ACK后,攻击者就不对连接信息进行再确认,那这个TCP连接就处于挂起状态,也就是所谓的半连接状态,服务器收不到再确认的话,还会重复发ACK给攻击者,这样会浪费服务器的资资,攻击者就对服务器发送非常大量的TCP连接,由于每一个都没完成三次握手,所以在服务器上,这些TCP连接会因为挂起状态而消耗服务的CPU、内存,最后服务器可以死机,就无法为正常用户提供服务了。

    解决SYN洪泛攻击的办法通常是设置 SYN Cookie。

 

  TCP连接释放过程

    参与TCP连接的两个进程中的任何一个都能终止连接,连接结束后,主机中的“资源”(缓存)将被释放。

    

    (1)客户端发送发连释放报文段,停止发送数据,主动关闭连接。FIN = 1(终止位),seq=u(序号位)。

    (2)服务器端回送一个确认报文段,客户端到服务器方向的连接就释放了--半关闭状态。ACK = 1(确认位),seq = v (序号位),ack = u + 1 (确认号)。

    (3)服务器端发完数据,就发出连接释放报文段,主动关闭TCP连接。FIN = 1 (终止位),ACK = 1(确认位),seq = w (序号位),ack = u + 1 (确认号)。

    (4)客户端回送一个确认报文段,再等到时间等待计时器设置的2MSL(最长报文段寿命)后,连接彻底关闭。ACK = 1(确认位),seq = u+1 (序号位),ack = w + 1 (确认号)。

  

五、TCP可靠传输

  TCP可以实现可靠传输指的是保证接收方进程从缓存区读出的字节流与发送方发出的字节流是完全一致的。

  TCP实现可靠传输的机制是 1.校验、2.序号、3.确认、4.重传。

    1.校验:与UDP校验方式一致,通过增加伪首部方式实现。

    2.序号:一个字节占一个序号,序号指的是一个报文第一个字节的序号。

    3.确认:TCP默认使用累计确认方法确认接收,就是ack字段。

    4.重传:确认重传不是分离的,TCP的发送方在规定的时间内没有收到确认就要重传已发送的报文段。即超时重传。

    注:TCP采用自适应算法,动态改变重传时间RTTs(加权平均往返时间)。

  

  冗余ACK(冗余确认)

    每当比期望序号大的失序报文段到达时,发送一个冗余ACK,指明下一个期待字节的序号。快速重传机制。

    

 六、TCP流量控制

  流量控制:让发送方慢点,让接收方来得及接收。TCP利用滑动窗口机制实现流量控制。

  在通信过程中,接收方根据自己接收缓存的大小,动态地调整发送方的发送窗口大小,即接收窗口rwnd(接收方设置确认报文段的窗口字段来将rwnd通知给发送方),发送方的发送窗口取接收窗口rwnd和拥塞窗口cwnd的最小值。

  TCP流量控制实例:

  A向B发送数据,连接建立时,B告诉A,我的rwnd= 400B,设每一个报文段为100B,报文段序号的初始值为1.

    

  注:TCP为每个连接设有一个持续计时器,只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器。

    若持续计时器设置的时间到期,就发送一个零窗口探测报文段。接收方收到探测报文段时给出现在的窗口值。

 

七、TCP拥塞控制

  出现拥塞的条件: 对资源需要的总和 > 可以资源。

  网络中有许多资源同时呈现供应不足->网络性能变坏->网络吞吐量将随输入负荷增大而下降。

  

  拥塞控制的目的

    防止过多的数据注入网络当中。全局控制。

 

  流量控制与拥塞控制的区别是,流量控制主要针对的是点对对的通信两方,而拥塞控制则是点对多点的通信控制,也可以理解为整段网络的通信控制。拥塞控制的四种算法,分别是慢开始、拥塞避免、快重传、快恢复。

  

  在讨论四种拥塞算法之前,我们设置以下的条件,方便问题的展开:

  1、数据单方向传送,而另一个方向只传送确认。

  2、接收方总是有足够大的缓存空间,因而发送窗口大小取决于拥塞程序。

    发送窗口 = MIn{接收窗口rwnd,拥塞窗口cwnd}

  接收窗口:接收方根据接受缓存设置的值,告知发送方,反映出接收方的接收容量。

  拥塞窗口:发送方根据自己评估的网络拥塞程度而设置的窗口值,反映网络当前的通信情况。

  

  慢开始、拥塞避免

    

    当A主机向B主机发送数据时(慢开始),刚开始是倍数增大滑动窗口值由1 变 2 变 4 变 8 变 16,当ssthesh= 16时,启动拥塞避免算法,然后只是加法增大滑动窗口值由 17 、18、19、20、21、22、23、24,当滑动窗口值设置成24时,发生拥塞,新的 ssthesh= 拥塞时窗口大小 /2 ,则  ssthesh= 12。马上把滑动窗口再次设置成为 1 ,然后再次使用倍数增大滑动窗口值由1 变 2 变 4 变 8 -> 12,当  ssthesh= 12时,启动拥塞避免算法,然后只是加法增大滑动窗口,直到发生拥塞就再次重新开始。

  

  快重传、快恢复

    

    快重传:当接收端收到3个重复的确认时,执行快重传算法。

    快恢复:当发生网络拥塞时,如上图当滑动窗口值设置成24时,发生拥塞,新的 ssthesh= 拥塞时窗口大小 /2 ,则  ssthesh= 12。启动快恢复算法,则滑动窗口从12开始设置,而不是重新设置为1的慢开始算法,接着执行拥塞避免加法增大法。

这篇关于传输层(1) 概述 UDP协议 TCP协议的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!