通信人家园

标题: tcp/udp端口监听等一些基本问题  [查看完整版帖子] [打印本页]

时间:  2014-9-10 19:12
作者: txr_2012     标题: tcp/udp端口监听等一些基本问题

问几个tcp/udp的问题
1)tcp只能是点对点/一对一的连接,所以,如果server端监听端口80,client端如果想要建立10条tcp连接,需要消耗client端的10个端口号来生成10个不同的socket(ip+port),来建立连接,是么?
2)tcp建立连接之后,如从A经过路由器R1,R2到B建立了一条连接,其实是在A,B端各自保存了一条到达对方的路径(A<-->R1<-->R2<-->B), 是么?对于路由器R1,R2而言,他们是否知道有这样的路径存在?对建立连接和释放连接两种情况,R1和R2的状态,有区别么?
3)
udp不是面向连接的,是指发送udp包之前,不需要先建立连接。那么上一个udp包和下一个udp包完全可以走不通路径达到目的地址对吧?
于此相对,tcp连接一旦建立,在这条链路上的tcp的包经过的路径(走过的路由器)完全相同,对吧?
4)tcp的工作原理,一般是,server端有tcp的端口监听,netstat -nap|grep LISTEN 即可查看,有连接上来之后,会有ESTABLISHED 状态的连接,使用netstat -nap|grep ESTABLISHED
即可查看。
3.a)对于udp呢?也会有端口监听是么?如何查看所有udp的监听端口?
3.b)既然udp通信的时候,不用先建立连接,为什么还是能看到某些ESTABLISHED状态的udp连接呢?
3.c)下面的netstat -nap|grep udp结果中,
0.0.0.0:* 与:::*有什么区别?
udp        0      0 0.0.0.0:123                 0.0.0.0:*                               -                  
udp        0      0 :::58146                    :::*                                    -         


时间:  2014-9-10 23:50
作者: water0x1y2z

作为一个高手,我不得不说两句。
1、“需要消耗client端的10个端口号”?:一般的场景就是这样的。但如果client端有多个ip,可以在bind socket时,指定相同的port,不同的ip。这样依然可以建立10个连接,占用了10个ip,但只用了1个port。
2、“其实是在A,B端各自保存了一条到达对方的路径(A<-->R1<-->R2<-->B), 是么”?:tcp协议不保存路径,顶多暂时保存上个一个报文的往返时间,除非在A,B端新开发这样的应用程序;“对于路由器R1,R2而言,他们是否知道有这样的路径存在”?:路由为三层设备,不关注传输层的东西,除非在路由器上新开发这样的应用程序”。
3、“tcp连接一旦建立,在这条链路上的tcp的包经过的路径(走过的路由器)完全相同,对吧”?:网络中的路径是由一个一个的路由器决定的,在传输数据时,路由器可能改变下一跳,可能会停机,所以整体路径会有变化。
4、“对于udp呢?也会有端口监听是么”?:udp不能监听,不能使用listen,但能用connect。udp是不强求面向连接的,但也支持面向连接。netstat -nap中,-n是显示连接的吧。
时间:  2014-9-11 21:27
作者: txr_2012

water0x1y2z 发表于 2014-9-10 23:50
作为一个高手,我不得不说两句。
1、“需要消耗client端的10个端口号”?:一般的场景就是这样的。但如 ...

多谢高手指点,不过有些问题再确认下:
问题2)中,对tcp通信的两个主体socket而言,tcp连接已建立的状态,和tcp尚未连接/已释放状态,有什么区别么?

问题4)中,netstat -n,这里是指num, " Show numerical addresses instead of trying to determine symbolic host, port or user names."是显示ip地址,不适用hostname
能详细介绍下udp的一般工作原理么?如果不需要端口监听,连接是如何建立的?
时间:  2014-9-13 20:39
作者: water0x1y2z

1、“tcp连接已建立的状态,和tcp尚未连接/已释放状态,有什么区别么?”:涉及到代码实现。linux或bsd中,用struct保存每个socket,用sockID作关键字,用链表连接所有struct。struct中有很多成员,包括四元组:本地ip、对方ip、本地port、对方port。已建立连接的tcp socket,四元组是有赋值的;没建立连接的tcp socket,四元组没有赋值。这样tcp处于连接状态后,只能和已确定的对方通信了。

2、“如果不需要端口监听,连接是如何建立的?”:udp处于ESTABLISHED状态,我没见到过。udp连接就是直接调用connect函数,这时是没有如tcp般的握手过程的,没有报文交互,就是将四元组赋值。这样不需要调用sendto/recvfrom函数了,直接调用send/recv即可。udp调用send时,只要报文发送出本机就算成功,对方有没有收到,需做另外开发。tcp调用send时,对方必须收到且回应了ack,才算发送成功,否则send函数返回错误。

时间:  2015-1-2 19:58
作者: txr_2012

water0x1y2z 发表于 2014-9-13 20:39
1、“tcp连接已建立的状态,和tcp尚未连接/已释放状态,有什么区别么?”:涉及到代码实现。linux或bsd中, ...

能否解释一下,tcp需要先建立连接,然后才能收发消息,有什么好处?

时间:  2015-4-21 22:24
作者: txr_2012

tcp先建立连接,然后才能收发消息,相比较Udp的无连接收发,有什么好处?




通信人家园 (https://www.txrjy.com/) Powered by C114