xiaolincoder / xiaolincoding_comment

7 stars 0 forks source link

[Vssue]4.18 TCP 和 UDP 可以使用同一个端口吗? | 小林coding #145

Open xiaolincoder opened 2 years ago

xiaolincoder commented 2 years ago

https://xiaolincoding.com/network/3_tcp/port.html

divisionblur commented 2 years ago

什么场景下会让一个客户端用上万个端口去连接一个服务器呢?

xiaolincoder commented 2 years ago

@divisionblur

什么场景下会让一个客户端用上万个端口去连接一个服务器呢?

客户端压测服务端的时候。

yynespoon commented 1 year ago

小林你好,想请教下端口复用的问题

1、我理解上述实验中能得出需要根据四元组(源ip、源端口、目标ip、目标端口)去定位唯一一条tcp连接。我的问题是:tcp是工作在传输层,它是怎么拿到ip信息的,因为在网络层已经将ip协议的头去掉了。个人猜想可能有两个原因:1)协议栈 socket 间隔离,每个 socket 都有自己的协议栈。2)ip协议拆除协议头的时候会将请求头中的ip信息传给上层。我个人倾向于第二个,不知道是否该这样理解。

2、根据四元组定义 tcp 连接是否违背了 tcp 设计的初衷呢?如果这样设计合理的话为什么 tcp 在定义协议的时候没有将 源 ip 跟 目标 ip 作为 tcp 头的一部分呢?

xiaolincoder commented 1 year ago

@yynespoon

小林你好,想请教下端口复用的问题

1、我理解上述实验中能得出需要根据四元组(源ip、源端口、目标ip、目标端口)去定位唯一一条tcp连接。我的问题是:tcp是工作在传输层,它是怎么拿到ip信息的,因为在网络层已经将ip协议的头去掉了。个人猜想可能有两个原因:1)协议栈 socket 间隔离,每个 socket 都有自己的协议栈。2)ip协议拆除协议头的时候会将请求头中的ip信息传给上层。我个人倾向于第二个,不知道是否该这样理解。

2、根据四元组定义 tcp 连接是否违背了 tcp 设计的初衷呢?如果这样设计合理的话为什么 tcp 在定义协议的时候没有将 源 ip 跟 目标 ip 作为 tcp 头的一部分呢?

  1. 就是你理解的第二点,ip协议拆除协议头的时候会将请求头中的ip信息传给上层

  2. 如果tcp头也有ip地址的信息,那和ip头部就有冗余的信息了。ip层和tcp层都在内核实现的,虽然说是两个层,但是这个层只是逻辑上的分层,两者之间还是可以通过函数传参数,把当前层的信息,传递给上层。

BeyonSir commented 1 year ago

小林你好 我想问一下 HTTP1.1允许对目标域名同时开启6个TCP连接,这6个TCP连接他们是否使用了端口复用呢?他们的四元组是否是相同的呢

xiaolincoder commented 1 year ago

@BeyonSir

小林你好 我想问一下 HTTP1.1允许对目标域名同时开启6个TCP连接,这6个TCP连接他们是否使用了端口复用呢?他们的四元组是否是相同的呢

是6个独立的tcp连接,四元组不相同

llsyyds commented 1 year ago

小林你好,这里有一个疑问,就是这里你写说客户端的端口可以重复使用,这里的客户端的ip + port可以相同,只要服务器不同就行。那是不是意味着在只要客户端对应的目标服务器(ip + port)不同,即使多个客户端同时绑定(bind)同一个ip和port也是可以的。 这里自己可能把客户端的端口是否可以重复使用和多个客户端是否可以bind同一个端口弄乱了

edsonyuuu commented 1 year ago

你好,问了AI,是可以使用相同的端口,但是TCP和UDP两种协议不能同时在端口使用,请问对于这个说法您有什么看法吗?请赐教

Leon-xc commented 1 year ago

@llsyyds

小林你好,这里有一个疑问,就是这里你写说客户端的端口可以重复使用,这里的客户端的ip + port可以相同,只要服务器不同就行。那是不是意味着在只要客户端对应的目标服务器(ip + port)不同,即使多个客户端同时绑定(bind)同一个ip和port也是可以的。 这里自己可能把客户端的端口是否可以重复使用和多个客户端是否可以bind同一个端口弄乱了

我也有这个疑问,客户端bind() 的不是自己的ip 端口吗,那么只要不是同一个目的ip,不就可以bind同一个套接字吗

rabbityqc commented 1 year ago

笔记:唯一确定一个应用程序需要三个元素:IP地址+协议类型+端口,只要有一个不同,那客户端进程复用端口就不会冲突。唯一确定一个TCP连接是看四元组,那么如果你要访问的服务器IP或者端口不同,那客户端就可以用已被使用的客户IP+客户端口的组合去发起新的请求。 Address already in use出现在两种情况下:1.端口确实被其他程序用了,2.上一次自己使用的TCP连接正在TIME_WAIT 状态。如果非要复用端口,那就socket设置 SO_REUSEPORT。如果非要复用TCP连接,那就用tcp_tw_reuse。

rabbityqc commented 7 months ago

同学你好,我不是小林,你可能github评论区看错人了。 再者,小林coding其实没必要看完,多看看数据库的https系列和索引那些东西就够了,直接上手投实习吧 祝你拿到好offer

------------------ 原始邮件 ------------------ 发件人: "xiaolincoder/xiaolincoding_comment" @.>; 发送时间: 2024年3月1日(星期五) 下午4:58 @.>; @.**@.>; 主题: Re: [xiaolincoder/xiaolincoding_comment] [Vssue]4.18 TCP 和 UDP 可以使用同一个端口吗? | 小林coding (Issue #145)

@llsyyds

小林你好,这里有一个疑问,就是这里你写说客户端的端口可以重复使用,这里的客户端的ip + port可以相同,只要服务器不同就行。那是不是意味着在只要客户端对应的目标服务器(ip + port)不同,即使多个客户端同时绑定(bind)同一个ip和port也是可以的。 这里自己可能把客户端的端口是否可以重复使用和多个客户端是否可以bind同一个端口弄乱了

小林确实没说清楚,我感觉ip+port相同的情况下,客户端的端口不可以重复使用,除非开了端口复用,也就是说和服务端的规则一致。

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you commented.Message ID: @.***>

jingyunoah commented 7 months ago

既然客户端可以不绑定端口随机分配,那么服务端可以不调用bind()就直接listen()吗,如果可以,会随机分配一个端口吗

AI-Learner-Liu commented 6 months ago

@jingyunoah

既然客户端可以不绑定端口随机分配,那么服务端可以不调用bind()就直接listen()吗,如果可以,会随机分配一个端口吗

在一般情况下,服务端在调用 listen() 函数之前必须先调用 bind() 函数将套接字绑定到一个特定的 IP 地址和端口上。bind() 函数告诉操作系统要监听的地址和端口,并使得该套接字与该地址和端口相关联。

如果服务端不调用 bind() 直接调用 listen(),在某些操作系统和网络库中可能会出现行为不确定的情况,可能会出现错误,也可能会随机选择一个未使用的端口进行绑定。但这种行为是不可靠的,不建议在实际开发中采用。

通常情况下,服务端应该显式地调用 bind() 来绑定地址和端口,这样可以确保服务端监听的是预期的地址和端口,避免了不确定性和潜在的错误。

severusq commented 5 months ago

小林你好,我有个问题,如果用SO_REUSEADDR来重启服务端在TIME_WAIT阶段的连接,但是如果四次挥手的最后一个ACK丢失了导致客户端重发FIN报文,而服务端也不在TIME_WAIT状态了,是不是会导致发一个RST报文给客户端,从而不是优雅地关闭连接了?