TCP和UDP——总结
一、什么是TCP?
TCP是TCP/IP体系中一个非常复杂的协议。
1、TCP的主要特点
1)TCP是面向连接的运输层协议。在使用TCP协议之前必须先建立连接,数据从传送完之后必须释放连接。
(这里类似于打电话,通话之前必须先拨号建立连接,结束通话需要挂断,断开连接)
2)每个TCP连接只能有两个端点,一条TCP连接之间必须是点对点(一对一)的。
3)TCP提供全双工通讯(全双工通讯指任意时刻通讯都是双向的),TCP允许通讯双方的应用进程在任何时候都能发送数据。TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双向临时存放的数据。
4)TCP提供可靠交付的服务,通过TCP传送的数据,保证无差错、不丢失、不重复,并且按顺序到达。
5)面向字节流。TCP中的“流”指的是流入到进程,或从进程流出的字节序列。
面向字节流的含义是:虽然应用程序和TCP的交互是一次一个数据块,但TCP把应用程序交下来的数据仅仅看成是一串无结构的字节流。TCP不保证接收方应用程序所收到的数据块和发送方应用程序所发出的数据块具有对应大小的关系,但接收方应用程序所收到的字节流必须和发送方应用程序所发出的字节流完全一样。
2、TCP的面向连接
1)两端通讯之前,必须先建立连接。
2)链接一旦建立,两端交互过程都在这一连接上完成,无需重新建立连接,知道关闭连接为止。
3)通讯完成后需要断开连接,已释放服务器的资源。
4)OS为我们维护连接,所以内核需要为连接分配相应的资源。
5)对服务器而言,一个连接只能为一个客户端服务,从而造成服务器性能有待优化。
3、TCP建立连接的过程——三次握手
4、TCP断开连接——四次挥手
5、TCP的编程流程
服务器端:IP地址+端口号
int listenfd=socket();//创建一个socket
bind();//将服务器的IP地址和端口号与listenfd绑定
listend();//内核启动监听,接收客户端连接(面向连接)
int c=accept();//获取一个连接完成的客户端
客户端:
int sockfd=socket();
bind();//可选,如果没有绑定,内核会自动选择一个可用端口,自动探测本地IP地址
connect();//发起连接与服务器完成绑定
send();//发送数据
recv();//接收数据
close();//关闭连接
二、什么是UDP?
用户数据报协议
1、UDP的主要特点
1)UDP是无连接的,即发送数据之前不需要建立连接
2)UDP使用尽最大努力的交付,即不保证可靠交付
3)UDP是面向报文的。发送放的UDP对应用程序交下来的报文,在添加首部后就向下交付IP层。UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。
4)UDP没有拥塞控制,因此网络出现的拥塞不会使元主机的发送速率降低。
5)UDP支持一对一,一对多,多对一和多对多 的交互通信。
6)UDP的首部开销小
2、UDP的编程流程
服务器:被动通讯方
int sockfd=socket();//创建socket
bind();//将服务器的IP地址、端口号与sockfd绑定
recvfrom();//必须接受对端信息
sendto();
close(sockfd);//关闭服务器
客户端:主动通讯方
int sockfd=socket();
bind();
sendto();
recvfrom();//可以不接收对端信息
close(sockfd);//关闭客户端
三、TCP与UDP的区别
TCP:面向连接的 可靠地 字节流服务
UDP:无连接的 不可靠的 数据流服务