一.概述

  运输层为不同主机上的应用进程之间提供直接的通信服务.使用端口区分一台主机上的不同应用进程.运输层提供了两种不同的运输协议(TCP和UDP).

二.基本概念

  端口号:用于区分主机上不同的应用进程.通信的实体实际上是主机上的具体应用进程,而不是主机,所以必须使用端口号区分.端口号使用16比特表示,取值范围0-65535.常用端口号中,0-1023为熟知端口号,被IANA指派给了TCP/IP体系中最重要的一些应用协议(FTP:21/20,HTTP:80,DNS:53等);1024-49151为登记端口号,被没有分配端口号的其他应用程序使用(Mysql:3306,Tomcat:8080等);49152-65535为短暂端口号,留给客户进程选择暂时使用.

三.TCP协议

  1.概述:TCP(Transmission Control Protocol)是一种提供可靠的连接服务的运输层协议.TCP需要三次握手建立TCP连接,在完成数据传输后,需要四次挥手释放连接.因为TCP协议通信前需要建立连接,所以TCP协议只支持单播数据传输.TCP面向字节流,也就是说TCP会将上层过长的报文进行拆分,

  2.TCP的流量控制

    在TCP连接中,为了使接收方有足够的时间处理数据,发送方发送数据的速度需要控制,这就是TCP的流量控制.TCP使用发送窗口机制进行流量控制:接收方在成功接收到数据后,会发送累计确认ACK消息回复发送方,ACK中带有最后一个成功接收的报文序号,发送方接收到ACK后,才会将自己的发送窗口进行移动,从最后一个成功接收的报文的下一个报文开始继续发送数据,直到所有数据完成发送.

  3.TCP的拥塞控制

    在网络连接时,一台路由器需要对接收到的报文进行读取以确定该转发报文到其他路由器还是发送报文到交换机或者丢弃报文,但是路由器的内存是有限的,短时间内如果接收到的报文超过了路由器的存储容量,路由器就不得不丢弃剩余的报文,这种情况就是拥塞.但是TCP连接时如果发生了拥塞,TCP的重传机制会被触发,发送方会重新发送报文,这时就会形成恶性循环,拥塞的情况不会得到缓解反而越来越严重,所以对于TCP连接,需要在发生拥塞时进行一些特定的处理以避免这种情况发生.

    1)慢开始:发送方维护一个拥塞窗口的状态变量,当发生超时重传时增大这个变量,当接收到确认报文后减小这个变量.发送方同时维护一个慢开始门限值作为判断是否发生拥塞的阈值,当判断没有发生拥塞时采用慢开始算法,当判断发生拥塞时采用拥塞避免算法.慢开始算法中,拥塞窗口值每次成功发送数据后翻倍,每次发送的报文数量为拥塞窗口值数.

    2)拥塞避免算法:当拥塞窗口值大于慢开始门限时,执行拥塞避免算法.拥塞避免算法每次成功传输报文后,将拥塞窗口值增大1,每次发送的报文数也等于拥塞窗口值.当发生超时重传时,会将拥塞窗口值置为1,然后将慢开始门限减半,之后执行慢开始算法传输报文.

    3)快重传:有时某些报文在未发生拥塞时丢失,但是发送方会误认为发生了拥塞,这样会降低传输效率.快重传要求发送方不必等待接收方的确认报文ACK,在发送一个报文后继续发送下一个报文.接收方确认时只确认最后一个有序正确的报文段,如接收方成功接收了序号1\2\3\5的报文段,序号4的报文段缺失,那么接收方发送的确认报文就是针对序号1\2\3\3的报文的确认,可以看到3号报文被重复确认了.当发送方接收到3次3号报文的重复确认后,就知道4号报文没有被成功接收,则重传一次4号报文.这样对于个别丢失的报文就不会触发超时重传.

    4)快恢复:当收到3个重复确认时,会将拥塞窗口值和慢开始门限值都变为当前拥塞窗口值的一半,而不是变为1,这样就继续执行拥塞避免算法而不会进入慢开始算法.

  4.TCP超时重传时间的选择

    由于每次传输经过的转发次数不同,导致每次传输的往返时间不同,所以实际超时重传时间一般设置为测量得到的往返时间的加权平均数.实际的计算过程更为复杂,样本加权平均往返时间还需要考虑上一次测量得到的样本加权平均往返时间.最终的平均往返时间等于测量得到的平均往返时间乘以一个系数α加上上一次的平均往返时间乘以1-α.RFC6298标准推荐的α值为0.125.超时重传时间为加权平均往返时间加上偏差的加权平均往返时间的4倍.超时重传时间需要保证略大于测量得到的加权平均往返时间.

  5.TCP的连接建立(三次握手)

    1)TCP客户端发送一个同步字段SYN为1,序号字段seq为x的报文.当TCP服务器接收到此报文时,TCP服务器就可以确认TCP客户端的发送功能正常.

    2)TCP服务器收到TCP客户端发送的数据后,会回复一个同步字段SYN为1,同步字段确认位ACK为1,序号位seq为y,序号位确认字段ack为x+1的报文,表示这是对SYN为1,seq为x的报文的确认回复.当TCP客户端接收到此报文时,TCP客户端就可以确认TCP服务器的发送功能和接收功能都是正常的.

    3)TCP客户端收到TCP服务器的确认回复后,发送一个确认字段ACK为1,序号位seq为x+1,序号位确认字段ack为y+1的报文,代表这是对TCP服务器的回复报文的回复,且和上一个TCP客户端发送的报文属于同一次TCP连接建立报文而不是上次报文的重传.当TCP服务器接收到这个报文时,TCP服务器就可以最终确认TCP客户的接收功能也是正常的.

  6.TCP的连接释放(四次挥手)

    1)TCP客户向TCP服务器发送一个终止字段FIN为1,确认回复ACK为1(对上次的报文进行确认),序号字段seq为u,序号确认字段ack为v的报文.当TCP服务器接收到此报文,TCP服务器就得知TCP客户想关闭连接.

    2)TCP服务器向TCP客户回复一个普通TCP确认报文,其中确认回复ACK为1,序号字段seq为v,序号确认字段ack为u+1.当TCP客户收到此报文后,TCP客户就得知TCP服务器已经收到关闭连接的请求,并且等待关闭.

    3)TCP服务器向TCP客户发送一个终止字段FIN为1,确认回复ACK为1,序号字段seq为w,序号确认字段ack为u+1的报文.当TCP客户收到此报文时,就得知TCP服务器已经准备好关闭连接.

    4)TCP客户向TCP服务器回复一个确认回复ACK为1,序号字段seq为u+1,序号确认字段ack为w+1的报文.当TCP服务器收到此报文时,就得知TCP客户已经进入关闭状态.TCP客户在进入关闭状态时会等待2个最长报文段寿命的时间(RFC793建议1个最长报文段寿命为2分钟),以防止TCP服务器未成功关闭连接的情况发生(TCP服务器未成功关闭连接可以通知TCP客户),然后TCP客户才会最终关闭连接.而TCP服务器在收到此报文后就会立即关闭连接,如果关闭失败会通知TCP客户(这时TCP客户还在等待时间内,没有关闭连接).

  7.TCP报文的首部格式

    TCP报文段首部由20字节固定首部和最大40字节的拓展首部组成.固定首部由2字节源端口\2字节目的端口\4字节序号(序号增加到最后一个值后下一个序号重置为0)\4字节确认号(上一个成功收到的TCP报文的序号加1,表示希望收到的下一个TCP报文的序号)\4比特的数据偏移(4被数据偏移量为TCP报文段的数据载荷距离数据首部的距离)\6比特保留字段(置为0)\1比特URG位\1比特ACK位\1比特PSN位\1比特RST位\1比特SYN位\1比特FIN位\2字节窗口(发送方的接收窗口,接收方根据这个值设置回复时的发送窗口)\2字节校验和\2字节紧急指针(指明紧急数据的位置,发送方有紧急数据时,将紧急数据插队到发送缓存的最前面).

四.UDP协议

  UDP(User Datagram Protocol)是一种提供不可靠连接服务的运输层协议.UDP不需要建立连接,发送方直接向接收方发送数据,发送方不需要了解接收方是否丢弃数据或者接收到的数据是否有误,接收方接收到的数据产生误码或丢弃数据时发送方也不作任何处理.UDP协议支持单播\多播和广播.UDP面向报文,也就是说UDP不会对上层过长的报文进行拆分.