概念不同
TCP:传输控制协议(TCP,Transmission Control Protocol)。 UDP:用户数据报协议(UDP,User Datagram Protocol)。
TCP因为其有算法的存在,所以也会消耗更多的资源,UDP就是给IP+Port发就行了。一个形象的例子:TCP类似打电话,接通与否、说话清楚与否都可以实时反馈,而UDP类似发短信,对方有没有收到我们也无从知晓(可能关机了),但是能群发……。所以说没有绝对的好或者是坏,即使是可靠的UDP传输。
套接字不同
无论是TCP还是UDP最终都是使用socket创建连接的。 int socket(int family, int type, int protocol); family:协议族。常用AF_INET,IPv4协议。 type:套接字类型。常用SOCK_STREAM(TCP协议)和SOCK_DGRAM(UDP协议)。 protocol:协议类型。常用IPPROTO_TCP和IPPROTO_UDP。
TCP创建socket: socket_id = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
UDP创建socket: socket_id = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
TCP 三次握手
三次握手只能由客户端发起。 //贴一段《UNIX网络编程-卷1》对三次握手的描述:
建立一个TCP连接时会发生下述情形。 (1) 服务器必须准备好接受外来的连接。这通常通过调用socket、bind和listen函数完成,称之为被动打开。 (2) 客户通过调用connect发起主动打开。这导致客户TCP发送一个SYN(同步)分节,它告诉服务器客户将在(待建立的)连接中发送数据的初始化序列号。通常SYN分节不携带数据。其所在IP数据报只含由一个IP首部、一个TCP首部及可能有的TCP选项。 (3) 服务器必须确认(ACK)客户的SYN,同时自己也得发送一个SYN分节,它含有服务器将在同一连接中发送数据的初始化序列号。服务器在单个分节中发送SYN和对客户SYN的ACK(确认)。 (4) 客户必须确认服务器的SYN。
每个ACK都是单独和一个SYN的序列号对应的,如上图的J对应J+1,K对应K+1。
TCP四次挥手
四次挥手双方均可发起。 //贴一段《UNIX网络编程-卷1》对四次挥手的描述:
TCP建立一个连接需要3个分节,终止一个连接需要4个分节。 (1) 某个应用进程首先调用close,我们称该端执行主动关闭。该端的TCP于是发送一个FIN分节,表示数据发送完毕。 (2) 接收到这个FIN的对端执行被动关闭。这个FIN由TCP确认。它的接收也作为一个文件结束符传递给接收端应用进程,因为FIN的接收意味着接收端应用进程在相应连接上再无额外数据可以接收。//此时刻接收端可以发但是不再接收数据了。 (3) 一段时间后,接收到这个文件结束符的应用进程将调用close关闭它的套接字。这导致它的TCP也发送一个FIN。//大家一起关闭。 (4) 接收这个最终FIN的原发送端TCP确认这个FIN。
每个ACK都是单独和一个FIN的序列号对应的,如上图的M对应M+1,N对应N+1。
Q:怎么从《UNIX网络编程-卷1》直接贴一段话啊? A:手打的。
文章第一段UDP和TCP不同的部分摘抄自腾讯面试:我倒在了网络基础知识,添加了一些自己的见解。描述有欠缺的地方可以评论指出,感谢。
|