现在绝大多数CS网络应用都是用TCP或UDP,这些传输协议都转而使用网络层协议IP,UDP是一个简单、不可靠的数据报协议,而TCP是一个复杂、可靠的字节流协议。
一、用户数据报协议UDP
UDP:应用进程将消息写入到套接字中,然后该消息被封装到一个UDP数据报中 ,然后又被封装到一个IP数据报,然后发送到目的地中。UDP不会保证先后顺序保持不变,也不保证数据报会到达目的地,也不会保证只到达一次
- 缺乏可靠性:需要应用程序实现端对端的确认、超时重传
- UDP数据报都有一个长度,数据报的长度会随着是数据传递给接收端应用程序,TCP是一个字节流协议,没有任何记录边界
- UDP是无连接的,即客户端与服务端不必有长期连接,一个UDP服务器可以从一个套接字从接受不同客户的数据报。
二、传输控制协议TCP
TCP客户先与某个给定服务器建立一个连接,再通过该连接与那个服务器交换数据,然后终止这个连接。
- TCP提供连接
- TCP提供可靠性,包括超时重传,TCp不是保证数据一定会被对方接受,二十提供数据的可靠递送或故障的可靠通知
- TCP含有动态估算客户和服务器之间的往返时间的算法,以便他知道等待一个确认需要多少时间
- TCP通过对每字节关联一个需要随所发送的数据进行排序
- TCP实现流量控制,TCP告知对端在任何时候他能接受多少字节的数据
- TCP是全双工的(full-duplex),意味着在一个给定的连接上应用在任何时候在进出两个方向上既发送数据又接受数据,在每个方向都保存序列号、通知窗口大小等状态信息
TCP的三次握手
- 服务器准备好接受连接,通过调用socket bind listen函数实现,被称作为被动打开
- 客户端使用connect发起主动打开,客户TCP发送一个SYN,告诉服务器客户将在即将建立的连接中的发送数据的初始序列号,其所在的IP数据报只有一个IP首部、一个TCP首部
- 服务器确认(ACK)SYN,并发送一个SYN,含有自己的初始序列号
- 客户端确定服务器的SYN
TCP 选项
- MSS选项:通告对端它能接受的最大分节大小,发送端只能使用接收端的MSS值作为所发送分节的最大大小
TCP连接终止:
TCP终止一个连接需要四个分节,有时候2、3合并,有的时候1随数据发送
- 某个应用首先调用close(),即该端执行主动关闭,发送一个FIN,表示数据发送完毕
- 接收到FIN的端执行被动关闭,传递给应用进程,因为接受了FIN所以在相应连接再无额外数据
- 一段时间后,接收到文件结束符的应用进程将调用close来关闭套接字
- 接收到最终FIN的原发送端将确认这个FIN
在步骤2到3之间,数据的单向流动是可能的,被称作为半关闭。
当一个进程无论是自愿还是非自愿(收到终止信号),所有打开的描述符都将关闭,这也导致打开的任何TCP连接上也发出一个FIN;
一般来说是客户端发送主动关闭,但有些协议(HTPP/1.0)由服务器执行主动关闭
TCP状态转换图
主动打开:当某个应用在CLOSED状态下执行主动打开,TCP将发送一个SYN,状态切换到SYN_SENT,如果收到一个带ACK的SYN,它将发送一个ACK,且新的状态是ESTABLISHED。
主动关闭:如果一个应用进程主动执行close(),则状态变为FIN_WAIT_1,
被动关闭:如果某个应用进程在ESTABLISHED阶段接收到了一个FIN,将执行被动关闭,将转化为CLOSE_WAIT,期间都可以发送数据,但是不能接受数据。