TCP/UDP-解调多路复用(5)

一 在解调多路复用中,套接字数据结构中有5个特征值起到了关键的作用:

        协议号(TCP/UDP) + 本地端口 + 本地IP + 远程端口 + 远程IP

 

二 对于tcp和udp来说,将传入的分组报文匹配到某个套接字的过程是一样的,有以下几点:

1 套接字数据结构中的本地端口号必须与传入的分组报文的目的端口号相匹配;

2 在套接字数据结构中,任何包含了通配符*的字段可以匹配分组报文中相应字段的任何值

3 如果有一个以上的套接字数据结构与传入的分组报文地址的4个字段匹配,那么谁使用的通配符少,谁就获得该分组报文

 

三 由第2点的介绍及结合套接字的特点可以规纳出如下几点:

 

1 在同一个主机上的套接字由: 协议类型(tcp或udp) + 绑定的本地iP + 绑定的本地port 唯一确定,注意这并不是说同一个主机上同一的 本地IP+本地PORT+Protacol不存在一个以上的套接字(见第(2)点)

 

2 在同一个主机上,除了监听socket accept的socket中它们之间的 本地IP+本地PORT+Protacol 可以相同,其余情况下,应用程序创建的socket(包括tcp套接字和udp套接字),本地IP+本地PORT+Protacol 的组合必需不一样,如果三者中有任何一个不一样,与么socket就能正常创建而不会造成冲突.

 

3 ■为什么监听socket accept的socket中它们之间的 本地IP+本地PORT+Protacol 可以相同和独立创建的tcp socket不能与监听socket的三个属性一致呢?

(1)监听socket的远程IP:PORT是通配符,而其接收的Socket的远程IP:PORT不是通配符,解调多路复用时可以特殊区分;

(2)独立创建的socket不能使用同一的"协议:本地IP:PORT",是为了呼应第(1)点,就是为了接收的socket对应的远程IP:PORT不可能一样,即是不可能在同一机子上独立new 出两个相同"协议:IP:PORT"的请求的socket来.这样才能在服务端的系统底层区分不同的套接字,从而正确地实现解调多路复用.

 

4 使用java socket API时,怎么确定本地或远程的地址和端口号呢?

(1)对于ServerSocket,所有构造函数都要求传入本地端口号。本地地址可能会在构造函数中指定,否则,就使用通配符(*)地址。ServerSocket的远程地址和端口号始终是通配符。

(2)对于新new 的 Socket,所有构造函数或connect()方法都要求传入特定的远程地址和端口号。本地地址或端口号可能会在构造函数中指定,否则,本地地址就使用用来建立到服务器的连接的网络接口地址,本地端口号就随机选择一个大于1023的未使用端口号。

(3)对于accept()方法返回的Socket实例,本地地址是从客户端发起的初始握手消息的目的地址,本地端口号是SeverSocket的本地端口,远程地址和端口号则是客户端的本地地址和端口号。

(4)对于DatagramSocket,本地地址和端口可能会在构造函数中指定,否则,本地地址将使用通配符地址,本地端口则随机选择一个大于1023的未使用端口号,远程地址和端口号都初始化为通配符并一直保持下去,除非调用connect()方法指定了特定的值。

 

5 理论上,主机中的多个程序可以同时访问同一个套接字(注意,不是创建),因为同一个套接字在不同程序间不容易共享,所以实际上不同程序要使用不同的套接字

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值