UNIX网络编程卷一 第二章 传输层TCP UDP SCTP

来源:互联网 发布:大数据上市公司 编辑:程序博客网 时间:2024/05/17 19:23

这一章主要概述了TCP/IP协议族的各种协议,主要讨论了传输层的 TCP UDP 和SCTP协议的通信过程。

一:总图


该图描绘了tcp/ip协议中各个协议的层次关系以及协议之间的关联。

如ping 命令,是基于ICMP和ip协议的基础之上的应用。

同时也能大致看出每一层包含哪些协议: api 以上的都属于应用层, 传输层只有TCP UDP SCTP三个协议, ipv4 ipv6 icmp igmp arp rarp 都归属于网络层, 链路层的协议则图中没有列出。 其中icmp 和 igmp 其实是位于IP之上的, arp 位于ip 之下,但是通常都把它们归为ip层。


二、 UDP协议

UDP 协议 是简单的、无连接的、不可靠的、 有记录边界的协议。

简单性 是指它没有重传机制,没有拥塞控制机制等特性,因此具有很高传输效率,在良好的链路条件下也有一定的质量保证。

无连接性 是指它无需要事先建立链路,知道服务器IP 和端口后就直接将数据发送出去,不需要管服务器端状态。

不可靠性 是指它传输的数据目的端不一定能收到,或者收到的数据不一定完全正确。

有记录边界 是指接收端在接收数据时会解析应用层里面的数据,如UDP数据报的长度等信息, 而TCP协议这个长度信息是在TCP首部的,tcp是面向字节流的协议,它没有记录边界,接收端只解析各层协议头并不解析应用发送的内容。

应用层交给UDP的数据,UDP只加8字节的头部然后交到IP层。


三、 TCP协议

TCP协议是一种面向连接的、可靠的、提供流量控制、基于字节流的全双工传输层通信协议。

1. 面向连接: TCP在客户和服务器在交换数据之前需要先建立一个连接(三路握手), 数据交换完成之后需要终止这个连接(四路)。

2. 提供了可靠性: 具有重传机制保证可靠性

3. 流量控制:TCP总是告诉对方通告窗口大小 ,当接收端通告窗口越来越小时发送方发送的内容也相应减少,当通告窗口为0时就暂停发送。

4. 基于字节流: 没有记录边界。

三路握手:


1. 客户端调用connect 主动打开连接。此时会向服务器发送 SYN (1B),图中序号为J。

2. 服务器调用accept 接收连接。 接收连接时向客户 发送一个SYN字节,捎带一个ACK响应客户。

3. 客户收到服务器响应后发送ACK响应服务器的SYN,然后connect返回,客户状态变为连接建立状态。

4. 服务器收到ack后,也进入连接建立状态, accept返回, 这时TCP连接成功建立。


**************************************************************************************

20170323修改

上述步骤有误:

第二步中,并非调用accept后才发送SYN字节,只要服务器端调用完listen后,TCP服务端就会自动发送SYN字节。

服务器调用完listen后会维护2个队列,一个已建立连接的队列,一个即将建立连接的队列,SYN、ACK字节都是在这一过程自动处理的,调用accept只是将一建立连接队列中的第一个套接字描述符返回,若没有就阻塞。

**************************************************************************************



TCP连接终止:


图中是客户主动终止连接,实际中双方都可以调用close终止连接,首先发起方最后会进入TIME_WAIT状态(需要等待2MSL秒才进入关闭状态,在此之前不能建立新的连接)

1. 客户先调用close时,会发送FIN字节。进入FIN_WAIT1状态。

2. 服务器接收到FIN后, read会返回0,tcp发送一个ACK响应客户端。进入close_wait(半关闭)状态

3. 服务器调用close,同时也会发送一个FIN字节。进入LAST_ACK状态。

4. 客户端接收到ACK 后,进入FIN_WAIT2状态。

5. 客户接收到FIN字节后,发送一个ACK响应。 进入TIME_WAIT状态。

6. 服务器收到最后一个ACK后,进入closed状态。


TCP状态转换图:



进入TIME_WAIT状态有2个作用:

1. 确保连接能正常关闭。eg:假如最后一个ack 丢失了,如果客户已经进入了closed状态,那么服务器将不停重传FIN,无法正常关闭。

2. 允许旧的数据报在网络中丢弃。大致意思是为了保证旧的TCP链接(已关闭)中的包,在新的TCP连接(刚打开,且和旧的TCP连接具有相同端口号)中需要丢弃,如果没有

TIME_WAIT状态,那么这个事情就无法避免;TCP保证TIME_WAIT状态时不能建立新的TCP连接。

四、 SCTP协议

这个协议与TCP协议类似,只是它支持多宿(每个套接字一段支持多个IP)。

SCTP使用四路握手建立关联(相对TCP增加cookie的交换),三路交换终止关联。它不需要进入TIME_WAIT状态,因为它使用了验证标记。


0 0
原创粉丝点击