这一篇是看了UNP的第二章后个人的一些总结和理解。
总述
TCP是面向连接的、可靠的传输协议。
UDP是无连接的、不可靠的传输协议。
SCTP是面向关联的、可靠的传输协议。
TCP
- TCP面向连接
TCP在进行端对端的传输时,要求客户端和服务端都都创建一个ip:port套接字。服务端要经过socket、bind、和listen三个阶段来创建;而客户端只经历一个socket阶段就创建完成。当客户端和服务器端交互时,客户端主动connect服务端以此建立通信。 - TCP可靠
TCP可靠主要体现在三个方面——报文传输序列化、建立连接时的三次握手、释放连接时的四次挥手。
报文传输的序列化使得每个发送的报文不会重复,同时有序的传输报文也能保证报文的完整性;建立连接的三次握手和释放连接的四次挥手就不细说了。值得注意的是在释放连接时,提出结束连接的那一方有一个TIME_WAIT状态。这个状态的设立有两个好处:
- 可靠地实现TCP全双工连接的终止
若在最后挥手确认时发送的ACK报文丢失了,就要由主动提出方重发,所以主动方要TIME_WAIT以预防该情况。 - 允许老的重复分节在网络中消逝
考虑这样一种情况,已经关闭的ip:port在经过一段时间后又要重新启用,如果之前它发送出去的报文因”迷路”还没有被丢弃,然后又恰好发送到了新建立的连接那,那么和它新建立连接的另一端怎么处理这个报文?因此需要等待一段时间来让所有之前已发送的报文被丢弃。
- 可靠地实现TCP全双工连接的终止
UDP
UDP 是无连接、高效的协议。
它高效是因为在发送数据时,只需要发送和接收两个环节即可。考虑TCP和UDP同时要发送一个不超过MSS的报文。UDP发送端只管发送就可以,它不并在乎接收端接收与否。而TCP则要先经历三次握手来建立连接,之后再发送;发送完成后再经历四次挥手释放连接。
此外,TCP由于在收发两端都存在一个数据缓冲区,因此它的接收和发送都受到了影响。例如有一个TCP发送端缓冲区大小为60字节,而要发送的数据有100字节,那么它只能先写入缓冲区60个字节,该进程阻塞等待所有字节写完;但UDP不同,它在发送端没有缓冲区一说,因此可以通过提高发送端带宽来快速地发送数据。虽然接收端有数据缓冲区,但UDP并不在乎数据是否被接收。我觉得这一点也是UDP比较高效的原因。
SCTP
SCTP面向关联是它两端并不是ip:port一对一的连接,而是ip*:port的组合。即每一端都有多个ip,但它们端口号都一样。具体怎么通信我还不太了解。
SCTP中的cookie我觉得能很好地确保安全传输。它的发送和接收端都有一个唯一的验证标识cookie,每次发送一个报文都要加上这个cookie来标识身份。
其他:
1.最大MSS 1460 = 1500 - 20(IP首部) - 20(TCP首部)
2.TCP和UDP的send和请求返回时,并不代表数据被接收到了,只是说明缓冲区中的数据被发送出去了;同理,recv请求返回时,也不代表数据被接收完了,只是说明缓冲区中数据开始读了。