udp学习杂记

来源:互联网 发布:windows下使用ipython 编辑:程序博客网 时间:2024/05/16 05:40

以下内容均是阅读《Unix网络编程》关于UDP章节的笔记。

1.因为udp的数据报的传输是不可靠的,所以,如果传出一个数据报之后然后通过读取操作获得返回结果,有可能发送的数据报没有发送成功,或者回复没有接受成功,都可能使得程序在读取操作中阻塞。所以,在读取操作的时候,可以定一个定时器,防止程序永远睡眠。

2.如果其他程序知道udp通信中的ip和端口号,就可以冒充通信中的另外一方,来进行攻击等恶意行为。例如客户端A发送了一个数据报给服务器,发送后,有另外一个程序冒充是服务器,给客户端发送数据报,它就可以通过这个数据报来进行一些恶意行为。为了保证通信中的安全,一种解决方法是客户端发送出去的数据报的地址结构体和接收到的数据报中的地址结构体是否相同,如果不同,就拒绝。但是这种做法会在某些情况下会有问题。因为,如果服务器没有绑定ip地址和端口号,那么在服务器回复的时候,如果服务器的主机上有多个ip地址,那么可能会选择一个不同于进来的ip进来(因为有可能绑定ip的时候用了INADDR_ANY),所以这种方法有缺陷。另外的方法是,可以通过通过dns中查找服务器主机的名字来验证主机的域名,或者可以给主机上的每一个ip地址创建一个套接字,用bind捆绑每一个ip地址到各自的套接字。

3.对于一个UDP套接字,由它触发的异步错误(即函数调用返回的时机和错误到达的时机不一致的错误,例如ICMP错误)并不会返回给它,除非它已连接(调用connect)函数。

4.客户的临时端口是在第一次调用sendto的时候一次性选定的,不能改变;但是客户的IP地址却可以随客户发送的每个UDP数据报而变动。

5.对于调用了connect的UDP套接字,不能使用sendto函数发送数据,而要用write函数或者send函数(或者在使用sendto的时候不能指定目的地址和端口),这意味着,调用了connect的UDP套接字只能和一个IP地址交换数据报(有可能那个IP地址是一个多播或者广播地址)。

6.对一个已经连接的UDP套接字再次调用connect,可以(1)指定新的IP地址和端口号,(2)断开一个套接字。对于第二个目的,可以通过把套接字结构中的地址族成员(sin_family,sin6_family)设置为AF_UNSPEC。

7.对于UDP套接字调用connect可以改善性能,从一个例子可以解释:如果要发送两个数据报,操作系统内核完成以下的操作:(1)连接套接字(2)输出第一个数据报(3)断开套接字连接(4)连接套接字(5)输出第一个数据报(6)断开套接字连接;而如果调用了connect之后,发送两个数据报,内核会进行以下操作:(1)连接套接字(2)输出第一个数据报(3)输出第二个数据报       这样步骤少了很多。值得注意的是,使用connect函数完全是本地操作,并不对对端主机发送任何消息。

0 0
原创粉丝点击