《网络编程》-第6章 – 基于UDP的服务器端/客户端_note
第6章 – 基于UDP的服务器端/客户端
1、TCP/UDP 区别
TCP | UDP |
---|---|
TCP是面向连接的 | UDP是面向无连接的 |
UDP程序结构较简单 | |
TCP是面向字节流的 | UDP是基于数据报的 |
TCP保证数据正确性 | UDP可能丢包 |
TCP保证数据顺序 | UDP不保证 |
1) UDP比TCP慢的原因
- 收发数据前后进行的连接设置及清除过程。
- 收发数据过程中为保证可靠性而添加的流控制
2、UDP套接字通信模型
UDP与TCP不同,无需经过连接过程。
也就是说UDP不需要调用listen()、accept()函数。
UDP只有创建套接字的过程和数据交换的过程,且客户端和服务器均只需要1个套接字。
3、UDP 常用函数
sendto() 函数
#include <sys/types.h>
#include <sys/socket.h>
ssize_t sendto(int sockfd, const void *buff, size_t len, int flags,
const struct sockaddr *to, socklen_t addrlen);
功能:
基于UDP协议 发送数据。
参数:
返回值:
成功,返回传输的字节数; 失败,返回-1。
【补:】
调用 sendto() 函数时会自动分配IP和端口号。因此,UDP客户端中通常无需进行额外的地址分配过程。
recvfrom() 函数
#include <sys/types.h>
#include <sys/socket.h>
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);
功能:
基于UDP协议 接受数据。
参数:
返回值:
成功,返回传输的字节数; 失败,返回-1。
4、习题
1) UDP为什么比TCP速度快?为什么TCP数据传输可靠而UDP数据传输不可靠?
UDP和TCP不同,不进行流量控制。由于该控制涉及到套接字的连接和结束,以及整个数据收发过程,因此,TCP传输的数据是可以信赖的。相反,UDP不进行这种控制,因此无法信任数据的传输,但正因UDP不进行流量控制,所以比TCP更快。
2) bce
3) UDP数据包向对方主机的UDP套接字传递过程中,IP和UDP分别负责哪些部分?
IP负责链路选择。UDP负责端到端的传输。
4) UDP一般比TCP快,但根据交换数据的特点,其差异可大可小。请说明何种情况下UDP的性能优于TCP?
UDP与TCP不同,不经过连接以及断开SOCKET的过程,因此,在频繁的连接及断开的情况下,UDP的数据收发能力会凸显出更好的性能。
5) 客户端TCP套接字调用connect函数时自动分配IP和端口号。UDP中不调用bind函数,那何时分配IP和端口号?
首次调用sendto函数时,发现尚未分配信息,则给相应的套接字自动分配IP和端口号。
6) TCP客户端必须调用connect函数,而UDP中可以选择性调用。请问,在UDP中调用connect函数有哪些好处?
每当以UDP套接字为对像调用sendto函数时,都要经过以下过程
1.第一阶段:为目标UDP注册端口和IP
2.第二阶段:数据传输
3.第三阶段:删除UDP注册的IP和端口信息
其中,只要调用connect函数,就可以忽略每次传输数据时反复进行的第一阶段和第三阶段。然而,调用connect函数并不意味着经过连接过程,只是将IP地址和端口号指定在UDP的发送对象上。这样connect函数使用后,还可以用write、read函数进行数据处理,而不必使用sendto、recvfrom。