UDP协议与TCP协议的比较

UDP协议在创建插口之后,可以同多个服务器端建立通信,而TCP协议只能与一个服务器端建立通信,TCP不允许目的地址是广播或多播地址,UDP允许。UDP协议客户端同服务器端的通信关系可以是一对多的关系,而TCP协议只能是一对一的关系。



当然UDP协议也可以像TCP协议一样,通过connect来指定对方的ip地址、端口(对应下图1中的③操作),connect是插口连接操作,connect操作之后代表对应的插口已连接,与TCP协议不同,UDP的connect实现不包含三向握手。不管是UDP协议还是TCP协议,connect实现的共同部分都包括:若所指定插口的本地地址、端口未指定,那么connect的时候由内核为其指定本地地址、本地端口,内核根据插口中的目的地址来判断外出接口,然后指定该外出接口的IP地址为插口的本地地址。UDP协议通过connect操作之后同服务器端的通信关系成为一对一关系,不再是一对多的关系,而且这时也不能指定目的地址为广播或多播地址,因为connect函数不允许目的地址为广播或多播地址。UDP协议经过connect之后,在通过sendto来发送数据报时不需要指定目的地址、端口,如果指定了目的地址、端口,那么会返回错误。通过UDP协议可以给同一个插口指定多次connect操作,而TCP协议不可以,TCP只能指定一次connect操作。UDP协议指定第二次connect操作之后会先断口第一次的连接,然后建立第二次的连接。


客户端在建立同服务器端的连接过程中,第一步都会通过socket建立连接套接字,然后通过bind来绑定本地地址本地端口,当然绑定操作可以不用指定


UDP协议:若未指定绑定操作,那么可以通过下面connect操作来由内核负责插口的绑定操作,若connect又未指定,那么绑定操作只好通过插口的写操作(sendto、sendmsg)来指定目的地址、端口,这时插口本地地址不会指定,为通配地址,而本地端口由内核指定,第一次sendto操作之后,插口的本地端口经过内核指定之后就不会更改。


TCP协议:若未指定绑定操作,可以通过下面connect操作来由内核负责插口的绑定操作。内核会根据插口中的目的地址来判断外出接口,然后指定该外出接口的IP地址为插口的本地地址。Connect操作对于TCP协议的客户端是必不可少的,必须指定。


(不管是UDP协议还是TCP协议,所对应插口经过connect操作之后就是已连接的插口,未经过connect就代表未连接的插口。)


通过bind来绑定本地地址、本地端口的时候,不管是已连接的还是未连接的插口,如果存在某一个插口的本地端口同用户所要绑定的本地端口相同,都会返回EADDRINUSE(Address already in use)错误。如果要绑定同已存在插口的本地端口相同的端口,必须先设置插口选项SO_REUSEADDR,然后再绑定。在linux系统中如果绑定的本地地址不同而本地端口相同可以不用设置插口选项SO_REUSEADDR,而对于其它的类UNIX系统根据《unix网络编程》中所描述的都要预先设置SO_REUSEADDR插口选项。


对于TCP协议绝不允许绑定的本地地址、端口同已存在的插口(不管是已连接的还是未连接的插口)相同。对于UDP协议通过设置插口选项SO_REUSEPORT,允许绑定相同的本地地址、本地端口。在linux系统中,没有SO_REUSEPORT这个选项,所以在linux系统中UDP协议同TCP协议一样都不允许存在两个插口有相同的本地地址、本地端口。

  TCP协议同UDP协议还有一个很大的不同点:例如有一台多宿主机,它所拥有的IP地址有A、B、C,现在创建4个相同的TCP监听端口port,对应的四个插口地址结构(*,port)、(A,port)、(B,port)、(C,port),现在有客户端要同(A,port)建立连接,那么只会同(A,port)插口建立连接,而不会同拥有通配地址*的插口建立连接。而如果是创建4个相同的UDP监听端口port,对应的四个插口地址结构(*,port)、(A,port)、(B,port)、(C,port),那么有客户端要同(A,port)建立通信,那么发送到(A,port)的数据报也会拷贝一份到(*,port)插口。原因:TCP协议之间的通信是一对一的关系,而UDP可以是一对多的关系。





步骤

  UDP协议

  TCP协议

  ①

  socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP)

  socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)

  ②

  bind捆绑本地地址、本地端口(可忽略,在下面connect中或第一次sendto由内核来指定)

  bind捆绑本地地址、本地端口(可忽略,在下面的connect操作中由内核来指定本地地址、端口)

  ③

  connect指定对方地址、端口,建立连接(可忽略由sendto指定对方地址、端口)

  connect指定对方地址、端口,建立连接

  ④

  读或写操作

  读或写操作

  客户端连接过程



 服务器端的连接过程比较

  对于UDP协议客户端与服务器端没有什么本质的区别,每个UDP协议的客户端也是服务器端。而TCP协议就不同了,TCP协议必须通过listen来申请监听,然后通过accept来接收一个客户端的连接,当接收客户端的连接会再创建一个单独的插口用来同客户端之间进行数据通信,也就是说服务器端由一个单独的监听插口负责监听客户端的连接请求,当接收到一个来自客户端的连接请求之后,服务器会另外创建一个插口负责同客户端之间进行连接通信。

  服务端在通过bind来绑定本地地址、本地端口的时候应注意的情况,同客户端是相同的。

  步骤

  UDP协议

  TCP协议

  ①

  socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP)

  socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)

  ②

  bind捆绑本地地址、本地端口(可忽略,在下面connect中或第一次sendto由内核来指定)

  bind捆绑本地地址、本地端口(可忽略,在下面listen操作中由内核来指定本地地址、本地端口)

  ③

  connect指定对方地址、端口,建立连接(可忽略由sendto指定对方地址、端口)

  listen监听客户端的连接

  ④

  读或写操作

  accept接受客户端的连接

  ⑤

  读或写操作

  服务器端连接过程



转载:http://itlab.idcquan.com/cisco/TCP/935195.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值