Socket是如何通信的?

Posted 车小胖谈网络

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Socket是如何通信的?相关的知识,希望对你有一定的参考价值。

问题描述

客户端连接的是服务端的80端口,所有的数据都发送给80端口,这个时候,tcp协议中的端口是80。但是服务端只是监听80端口,然后使用一个新的socket和客户端通信,新的socket端口是重新分配的,假设端口号分配的是12345,服务端将响应数据从这个端口发送出去,长连接建立起来之后,服务端从新的12345端口接受数据,但是客户端还是将数据发送到80端口(因为客户端创建套接字的时候,只知道服务端公开的端口是80),那么服务端是怎么在新的12345端口上获取数据的?换句话说,客户端tcp协议的目的端口是80,12345端口如何收到发送到80端口的数据?

 

 



题主犯了“唯心主义”错误,凭借天马行空的想象力,服务器应该用一个全新的端口号(不同于80端口)来服务客户端,到最后自己怀疑自己。

 

首先,服务器依然会使用80端口号来服务客户端,这样当服务器响应的报文到达客户端时,客户端会检查四元组,源IP、目的IP、源端口、目的端口,看看是否和发出去的报文完全匹配。

 

将接收到四元组计算出相应的Socket ID,用ID做为关键字检索Socket数据库:

 

  • 检索成功,用检索到的Socket来处理接收报文

  • 检索失败,丢弃处理

 

很显然,如果服务器不使用80端口做为源端口,客户端将检索失败,丢弃处理。这样TCP连接永远都无法建立起来。

 

其实服务器的处理和客户端大同小异,分三个逻辑分支:

 

  • 检索成功,用检索到的Socket来处理接收报文

  • 检索失败,服务器侦听(listen)目的端口,创建全新的Socket服务客户

  • 检索失败,服务器没有侦听目的端口,丢弃处理

 



客户端与服务器端的身份并没有天然差异,差别就在于是否在某个端口侦听,愿意为别人提供服务。如果客户端在某个端口侦听,那它已经是服务器了,要采用服务器三分支的逻辑分析问题。

 

对于这些基础知识点,最好的方法还是找本经典的教材,踏踏实实地学习,站在前人的肩膀上,能让自己看得更高、更远!

以上是关于Socket是如何通信的?的主要内容,如果未能解决你的问题,请参考以下文章

Socket是如何通信的?

c# socket 通信时如何限速?

如何创建一个socket并进行通信

SOCKET是什么

同一端口,如何区分不同的socket

如何检查oracle数据库端的socket通信中断