UDP的connect

一、 简介:

UDP是无连接的协议,不需要connect可以直接使用sendto/sendmsg等携带对端信息的函数对数据进行发送接收,但是其实UDP的socket也是可以进行connect的。

connect完的socket和未connect的socket有如下区别:[1]

1. 可以使用不指定目的信息的接收发送函数,如read/write

2. 由已连接UDP套接字引发的异步错误会返回给它们所在的进程,而未连接UDP套接字不接收任何异步错误。

3. 收发的性能上略有不同,未连接的需要在每次收发开始结束时的时候连接套接字、断开套接字连接(必要信息的复制)(查询路由表由于有缓存的作用,并不一定需要反复查找),会造成额外的开销。

4. 基于已连接的UDP套接字可以确定相应服务器的出口IP。

二、UDP connect对路由高速缓存的影响:

[@iZ25yrrem9lZ local_host]$ route -C | grep eth1 | grep google-public-d
[@iZ25yrrem9lZ local_host]$ ./a.out 
Local IP
[@iZ25yrrem9lZ local_host]$ route -C | grep eth1 | grep google-public-d
src    google-public-d gw         0      0        0 eth1
src    google-public-d gw         0      0        0 eth1
[@iZ25yrrem9lZ local_host]$ ./a.out 
Local IP
[@iZ25yrrem9lZ local_host]$ route -C | grep eth1 | grep google-public-d
src    google-public-d gw         0      0        <strong>1</strong> eth1
src    google-public-d gw         0      0        <strong>1</strong> eth1
eth1为外网网卡,a.out通过connect 8.8.8.8谷歌DNS服务器获取本机IP。

第一次查找路由缓存时候,缓存中并没有相应信息。

第一次connect后查看路由缓存,缓存中已经添加相应条目。

第二次connect后查看路由缓存,缓存中相应条目的使用次数增加了。

三、内核2.6中UDP connect的过程:

1. ip4_datagram_connect:

connect后根据fd获取相应的socket结构体,在ip4_datagram_connect开始进行连接。该函数中,主要进行的是路由表的搜索,ip_route_connect。

查找路由的主要函数为__ip_route_output_key,代码具体解释见 http://biancheng.dnbcw.info/linux/263078.html

路由表主要结构体操作见 http://blog.csdn.net/qy532846454/article/details/6423496



参考资料:

[1] UNP 8.11.1, 8.11.2, 8.14


你可能感兴趣的:(UDP的connect)