TCP-IP-part10-TCP与UDP(二)

前言

TCP/IP相关内容第十部分,包含:

  • TCP
  • 其他传输层协议
  • UDP首部格式
  • TCP首部格式

一、TCP

TCP是面向有连接的协议,为通信提供控制。可以进行重发控制和顺序控制。其保证从下层接收的数据包是正确的再交付上层。

1、TCP的特点及目的

传输过程中可能遇到的问题:数据破坏、丢包、重复及分片顺序混乱。
通过校验和、序列号、确认应答、重发控制、连接管理、窗口控制来解决上述问题。

2、通过序列号和确认应答提高可靠性

接收端每收到一个数据包就会返回一个ACK确认应答,包含下一个包应该开始的字节序号。发方收到ACK后才知道下一步该怎么做。若未收到ACK则重发数据包。

序列号是按顺序给发送数据的每一个字节都标上号码的编号。初始值是一个随机数,后面的每一字节加一。TCP首部的序列号指后面的数据中第一个字节的编号,接收端根据发来的序列号和数据长度计算ack值(确认应答号,下一个应该发来的数据序号)应答返回给发送方。

TCP数据长度是通过IP包总长-IP包首部长度-TCP首部长度得到的。

3、重发时间确定

将上一次数据包的往返时间和其多次统计出来的统计偏差相加,稍大一点的值即为重发前等待的时间间隔。重发超时都是0.5s的整数倍,最初设置为6s左右。

数据重发之后会再次重发,等待确认的时间以2的指数倍增长,当重发次数一定时还无应答,则强制关闭连接。

4、连接管理

在通信开始前三次握手,发送SYN包。在通信结束前四次挥手,发送FIN包。

5、TCP以段为单位发送数据

MSS:最大消息长度,单位字节。根据链路的MTU计算出来的TCP数据部分的长度,IP不会再分片的最大长度。MSS是在三次握手的时候在两端主机之间被计算出来的,在建立连接的请求时,会在TCP首部写入四字节的MSS选项,此时TCP首部为20+4=24字节,告诉对方自己接口能够适应的MSS大小,双方之间选取一个较小的值使用。

6、利用窗口控制提高速度

采用MSS好几倍大小的的窗口(缓冲区)发送数据包,确认应答不再是以每个分段(MSS),而是以更大的单位进行确认,这样转发时间大大缩短。TCP将按序连续发送(不等ACK)窗口内的数据包,数据从上层进入缓冲区时是字节按顺序进入的,发送的时候是划分段(MSS)再统一发出去。当收到对方的ack之后将对应的数据从缓冲区中删除(出队),腾出空间之后可以让后面的字节进入缓冲区。即“滑动窗口”机制。

窗口内的数据即便没有收到确认应答也可以发送出去,若缓冲区已满,则窗口停止滑动,不再有新的字节进入缓冲区,可能需要重发某些段,直到有ACK收到,数据清除后腾出地方再滑动窗口。

7、窗口控制与重发控制

确认应答丢包了影响不大,只要能收到一个ACK,则其确认号之前的数据都已确认接受。

当报文段丢失时,接收端在没有收到自己期望序号的数据时,会对之前收到的数据进行确认应答(但是发过来的数据依然会被接收并进入缓存区),发方连续收到3个同样的确认应答,则认为数据段丢失,需重发(高速重发控制)。

8、流控制

如果发方的窗口过大,发来过多的数据包超出了收方的缓冲区,那么数据包将被丢弃,造成网络流量的浪费,因此需要流控制。接收端主机向发送端主机通知自己可以接受数据的大小,(通过TCP首部的字段),发送端会发送不超过这个限度的数据。

当收方的缓冲区满的时候,可能会返回窗口值为0,此时发方停止发送。之后收方会再发一个窗口更新通知来让发方继续发送。若更新通知丢包,发方一直暂停发送,且收不到更新窗口的通知,则发方会在一定时间内发送窗口探测的数据段(包含一个字节———窗口值,且有序号:SYN包、FIN包、窗口探测数据段都是一个字节的增加序列号),通知收方再发一次窗口更新通知。

9、拥塞控制

发方根据自己收到的ACK的情况(网络拥堵情况)来调整窗口大小,实际窗口大小取决于拥塞窗口和流控制窗口的最小值。

拥塞控制过程:慢启动、拥塞避免过程,超时处理、高速重发处理。

10、提高网络利用率的规范

  1. Nagle算法:当发送的这部分数据很少时,可以延迟发送。
    以下两个条件都不满足时,进行延迟一段时间后在发送:
  • 窗口内已发送的数据都已经收到确认应答(自己已经是缓冲区的队首了,必须发了,不能再等了,再等信道空闲了利用率更低)
  • 可以发送最大段长度(MSS)的数据时。
    实际上这个算法会造成延迟,一般不用。
  1. 延迟确认应答
    收到数据以后并不立即返回确认应答,而是延迟一段时间,否则返回的窗口值会很小,降低利用率。如采用每到两个数据段发送一次确认应答。由于滑动窗口的控制机制,这并不妨碍发方确认。

  2. 捎带应答
    TCP的确认应答和应用层的回执数据通过一个包发送,使收发的数据量减少。需要延迟确认应答,等待应用处理完数据并将作为回执的数据返回为止才进行捎带应答,要延迟一段时间给上层处理才能应答。

二、其他传输层协议

1、UDP-Lite

计算校验和的范围可以自由指定。只针对不允许发生错误的部分进行校验和检查(如端口号和IP地址),对于其他部分,即使发生错误也忽略不计,不会抛弃包。

2、SCTP

支持多重宿主,多个NIC的主机在切换时(如以太网切换到无线LAN)依然能够继续同心

3、DCCP

辅助UDP的传输层协议,面向连接、不提供可靠性传输(不会重发和顺序控制)、能够进行拥塞控制。

三、UDP首部格式

UDP首部

共8个字节。

  1. 源端口号
    长度2个字节:0~65535。在不需要返回的通信中可以设置为0。

  2. 目的端口号
    2个字节

  3. 包长度
    2个字节,表示UDP首部长度和数据长度之和,单位为字节。

  4. 校验和
    发方先根据源IP地址、目的IP地址、1字节填充0、1字节协议号(17)、2字节UDP包长度构造12个字节的伪首部,据此计算校验和的值放入UDP首部的校验和字段。删除伪首部之后封装IP首部并发送出去。收方收到UDP数据包后从IP首部获得IP地址后构造伪首部,计算校验和来与UDP首部的校验和比较。传输层对IP地址的校验是为了防止路由程序对数据的破坏。而网络层的校验是防止传输噪声的破坏。UDP的校验和可以不使用,填为0即可关闭。

四、TCP首部格式

TCP首部

最短20字节,最长40字节。

  1. 源端口号
    2个字节

  2. 目的端口号

  3. 序列号seq
    4个字节,单位字节,指发送数据的位置,每发一次数据,就累加一次该数据字节数的大小。建立连接时初始化为一个随机数,通过SYN包告知对端,通过应答确定同步。SYN包、FIN包、窗口探测包都会使序号数加一。

  4. 确认应答号ack
    4个字节,指下一次应该收到的数据序列号,也指之前的数据已正确接收。

  5. 数据偏移
    4bit长度,表示TCP数据部分从哪个位开始,可以看做是TCP首部长度,单位4字节。TCP首部为20字节时,其值为5。

  6. 保留位
    4bit,一般设为0,暂时没用。

  7. 控制位
    8bit,分别为:
    CWR:与后面的ECE用于IP首部的ECN=ECT+CE字段,当设为1时表示通知对方为处理拥堵发送窗口已减小。
    ECE:收到的IP首部的ECN为1时,置ECE为1,通知对方网络拥堵,应该减小发送窗口。
    URG:为1时表示包中有需要紧急处理的数据,用到紧急指针。
    ACK:为1时确认应答号ack有效,除了SYN包之外该位必须为1。
    PSH:为1时表示收方应尽快将这个包交付上层,不要走缓存。
    RST:为1时表示TCP连接中出现异常必须强制断开连接。
    SYN:用于建立连接,SYN=1,ACK=0,表示连接请求,两方都会发SYN包用于同步自己的随机序号。
    FIN:该位为1时,告知对方自己不再发送数据,希望断开连接。

  8. 窗口大小
    2个字节,用于通知从相同TCP首部的确认应答号所指位置开始能够接受的数据大小,单位字节,用于流控制。窗口为0时表示可以发送窗口探测,这个数据必须是一个字节。

  9. 校验和
    2个字节,与UDP相同用12字节的伪首部计算。协议号为6。TCP的校验和不可关闭,必须使用。

  10. 紧急指针
    2个字节,在URG为1时有效,表示从数据部分首位到紧急指针所指位置为止为紧急数据,具体怎么处理是应用层的问题。

  11. 选项
    最多可使TCP首部达到40字节。

您的支持是我创造源源不断地动力