TCP 协议中socket、port和进程的对应关系

前言:最近再看计算机网络,作为一个菜鸡一开始对socket和port(端口)一直分不清楚,查了各种资料,算是明白了,怕忘记于是就记录下来。

首先提出我一开始的几个问题:

  1. 什么是socket(套接字)
  2. 什么是端口
  3. port和socket的关系是什么
  4. port、socket和进程的关系又是什么

1.什么是socket?

        关于这个问题我现在也没办法给出一个很具体的定义,网上找的对于socket的定义都是很抽象的,我也一直没明白,为什么socket要翻译成“套接字”,这个翻译让我一开始愚蠢的以为它就是一种“字”,《自顶向下》给出的定义是:

套接字是同一台主机内应用层与运输层之间的接口

当然不同OS对于socket的定义也是五花八门,这里就不说了。我还看见过“socket = ip + port” 这样的解释,显然这个解释真的是一种“字”,但是其实不太妥当。

        socket其实可以理解是TCP连接的两个endpoint,即在客户端和服务器端的一条TCP连接中有两个socket,一个在客户端的运输层与应用层之间,一个在服务器端的运输层与应用层之间。发送方应用层的进程把要发送的信息推入到socket里,信息就会经过一系列复杂的传输到达接收方的对应socket“门口”,然后被推进这头门,到达对应的接收进程。先解释到这,后面还会解释。

 

2.什么是端口 ?

        个人理解:端口就是用来标识进程的(后面再说线程)一个标识符,是一个16位的二进制数,其范围从0~65535。运输层在网络层的上面,网络层提供了主机之间的逻辑通信,而运输层为运行在不同主机上的进程之间提供了逻辑通信,不同的主机用ip地址来区分,一个主机上的不同进程用端口来区分。经常听到什么“http协议默认是80端口”,这个可以粗略理解为用来处理http报文的进程运行在服务器的80端口。

3.port和socket的关系是什么?

        在同一台主机上,一个socket包含一个端口,一个端口可以被写进多个socket,端口和socket是1对多的关系。

4.port、socket和进程的关系又是什么

       一个进程可以对应多个端口,但是一个端口只能被用于标识一个进程。一个进程可以对应多个socket,但是一个socket只能归属一个进程。

5.结合TCP来解释上面的关系

        一个服务器上会有一个监听socket,顾名思义就是监听有没有客户端的连接,这个socket的端口是预先分配的,比如用于HTTP服务的就是80,这个80号端口上有一个用于服务HTTP的进程,当客户端一个请求过来的时候,这个监听socket会生成一个新的socket,由这新的socket与客户端的socket相连接,这个新的socket并不会换一个端口,还是80,于是在服务器端的80端口上就有2个socket了。随着更多的客户端向这台服务器发来连接请求(假设连接都是用于HTTP),服务器80端口就会有更多的socket,这也就说明了 第三个问题 和 第四个问题 。

这图片我第一次看因为新生成的socket和监听socket不是一个端口。。。

        但是问题又来了,客户端和服务器端的socket都是相互对应的,他们是如何区分的?TCP连接的socket会通过<协议,源ip,源port,目的ip,目的port>做为唯一的主键,来区分彼此,这些挤在80端口的socket的目的ip,目的port自然是一样的,他们的源ip,源port会不一样,这自然就区分开来了。

        最后真么多socket都想往一个进程里传递信息,那这个进程岂不是忙死了,这时候就要说到线程了,如果可以的话,服务器可以为每个socket再开辟一条线程,这样理解的话线程和socket是一一对应,但是我目前还没找到依据,欢迎大家补充。

 

以上截图都来自《计算机网络-自顶向下方法第七版》

本人第一次写博客,欢迎大家发现、指出错误,互相促进,我会及时修改 。最后祝大家1024快乐!

一些参考

https://stackoverflow.com/questions/3638953/do-tcp-connections-get-moved-to-another-port-after-they-are-opened

network programming - Does the port change when a server accepts a TCP connection? - Stack Overflow 

     

        

  • 18
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值