《网络编程》-第6章 – 基于UDP的服务器端/客户端_note

第6章 – 基于UDP的服务器端/客户端

1、TCP/UDP 区别

TCP UDP
TCP是面向连接的 UDP是面向无连接的
UDP程序结构较简单
TCP是面向字节流的 UDP是基于数据报的
TCP保证数据正确性 UDP可能丢包
TCP保证数据顺序 UDP不保证

1) UDP比TCP慢的原因

- 收发数据前后进行的连接设置及清除过程。

- 收发数据过程中为保证可靠性而添加的流控制

2、UDP套接字通信模型

《网络编程》-第6章 – 基于UDP的服务器端/客户端_note

​ 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协议 发送数据。

参数:

《网络编程》-第6章 – 基于UDP的服务器端/客户端_note

返回值:

成功,返回传输的字节数; 失败,返回-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协议 接受数据。

参数:

《网络编程》-第6章 – 基于UDP的服务器端/客户端_note

返回值:

成功,返回传输的字节数; 失败,返回-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。

代码入口