@TOC
socket编程之传输层简介:tcp 、udp 和sctp
本篇博客主要介绍TCP、udp和sctp(流控制传输协议),通过从网络编程的角度去理解这些协议。
TCP/IP协议族-总图
在TCP/IP协议中除了TCP 和 IP 协议外还包含了其他的协议成员,下图就这些协议的概况
下面大致说明下这些协议框
TCP的连接和终止
UDP是一个简单传输协议,UDP协议不保证其数据包会到达最终的目的地,也不保证各个数据包的先后顺序,也不保证每个数据包只会到达一次,在socket网络编程中是缺乏可靠性的。若要是使用udp协议传输需要用户来定义确认机制,超时与重传机制,以及数据的先后顺序验证机制。
TCP协议-传输控制协议
TCP协议不同于UDP协议,提供了可保性。
1.具有连接确认机制;
2.具有数据接收确认机制;
3.具有超时重传机制,并且就有RTT算法(具有动态估算客户和服务器之间往返的时间)来确定需要等待的时间;
4.具有数据包先后序列号机制;
5.提供流量控制,TCP总是告诉对方在任何一时刻一次它一次能够接收多数字节的数据这个称为通告窗口;
STCP协议-流控制协议
STCP协议与UDP协议和TCP协议类似。
1.客服和服务器之间提供关联,并且像TCP那样提供可靠性、流控、排序机制,但是可以涉及多于两个ip主机的通信。
2.像UDP一样面对消息的方式来进行操作,保护消息边界。
TCP建立连接与终止
TCP的三次握手
建立一个tcp会发生以下情形
1.tcp服务端必须准备好接收外来的连接;因此在socket编程创建服务端的时候调用socket、bind、listen这三个函数来被动打开;
2.tcp客户端应主动调用connect主动连接服务端,同时需要发送一个syn分节,告诉服务端待建立连接的初始序列号;
3.服务端必须确认ack并且需要发送syn分节它含有同一连接的初始序列号;
4.客户端必须确认服务器的syn;
这种交互至少需要三次,称为三次握手,如下图
###TCP选项
每一个syn中含有多个tcp的选项,以下是常用的tcp选项
1.MSS选项,发送syn的一端告知对端它的最大分节大小,也就是它在本连接的而每个tcp愿意接受的最大数据量;
2.窗口规模选项,tcp的任何一端可以告知对端的最大的窗口大小是65535,因为该数据位沾两个字节。
3.时间戳选项,可以防止失而复现的分组可能造成的数据损坏。
###TCP的终止
tcp的建立需要3个分节,而终止需要四个分节。
1.某个应用首先调用close,socket(主动关闭),该端发送一个fin分节,表示数据发送完毕;
2.接收到fin的分节为被动关闭,这个fin由tcp确认,它的接收作为一个文件结束符传递给接收应用端;
3.一段时间后接收到这个文件结束符的应用端也调用close关闭socket。这导致tcp也发送一个fin;
4.原关闭端需要确认这个fin
每一个方向都需要一个fin和ack那么需要4个分节,也称为四次挥手,如下图;
TCP的状态图
在tcp通信调试的可以通过netstat 监视状态来对应调试,如下图
SCTP关联的建立和终止
与tcp的一样,sctp也是面向连接的,因此也有关联的建立和终止过程。不过sctp的握手过程不同于tcp
SCTP关联的建立
1.服务端必须准备好接收外来的关联;因此在socket编程创建服务端的时候调用socket、bind、listen这三个函数来被动打开;
2.客户端应主动调用connect主动连接服务端,同时需要发送一个init初始化消息,告诉服务端客户的ip地址清单,初始序列号等;
3.服务端必须确认init 消息ack并且需要发送状态cookie包;
4.客户端以cookie echo回射服务器的状态cookie;
5.服务器以cookie ack确认客户端回射的cookie是正确的;
具体四次握手,过程如下图。
SCTP关联的终止
stcp不像TCP那样允许半关闭的关联,当一端关闭关联后,另一端停止发送新的数据,发送完排队的数据完成关联的关闭,如下图