`

socket通信协议关系详解

 
阅读更多

要写网络程序就必须用Socket,这是程序员都知道的。而且,面试的时候,我们也会问对方会不会Socket编程?一般来说,很多人都会说,Socket编程基本就是listen,accept以及send,write等几个基本的操作。是的,就跟常见的文件操作一样,只要写过就一定知道。 
         对于网络编程,我们也言必称TCP/IP,似乎其它网络协议已经不存在了。对于TCP/IP,我们还知道TCP和UDP,前者可以保证数据的正确和可靠性,后者则允许数据丢失。最后,我们还知道,在建立连接前,必须知道对方的IP地址和端口号。除此,普通的程序员就不会知道太多了,很多时候这些知识已经够用了。最多,写服务程序的时候,会使用多线程来处理并发访问。
我们还知道如下几个事实:
      1。一个指定的端口号不能被多个程序共用。比如,如果IIS占用了80端口,那么Apache就不能也用80端口了。
      2。很多防火墙只允许特定目标端口的数据包通过。
      3。服务程序在listen某个端口并accept某个连接请求后,会生成一个新的socket来对该请求进行处理。
于是,一个困惑了我很久的问题就产生了。如果一个socket创建后并与80端口绑定后,是否就意味着该socket占用了80端口呢?如果是这样的,那么当其accept一个请求后,生成的新的socket到底使用的是什么端口呢(我一直以为系统会默认给其分配一个空闲的端口号)?如果是一个空闲的端口,那一定不是80端口了,于是以后的TCP数据包的目标端口就不是80了--防火墙一定会阻止其通过的!实际上,我们可以看到,防火墙并没有阻止这样的连接,而且这是最常见的连接请求和处理方式。我的不解就是,为什么防火墙没有阻止这样的连接?它是如何判定那条连接是因为connet80端口而生成的?是不是TCP数据包里有什么特别的标志?或者防火墙记住了什么东西?后来,我又仔细研读了TCP/IP的协议栈的原理,对很多概念有了更深刻的认识。比如,在TCP和UDP同属于传输层,共同架设在IP层(网络层)之上。而IP层主要负责的是在节点之间(End to End)的数据包传送,这里的节点是一台网络设备,比如计算机。因为IP层只负责把数据送到节点,而不能区分上面的不同应用,所以TCP和UDP协议在其基础上加入了端口的信息,端口于是标识的是一个节点上的一个应用。除了增加端口信息,UPD协议基本就没有对IP层的数据进行任何的处理了。而TCP协议还加入了更加复杂的传输控制,比如滑动的数据发送窗口(Slice Window),以及接收确认和重发机制,以达到数据的可靠传送。不管应用层看到的是怎样一个稳定的TCP数据流,下面传送的都是一个个的IP数据包,需要由TCP协议来进行数据重组。
所以,我有理由怀疑,防火墙并没有足够的信息判断TCP数据包的更多信息,除了IP地址和端口号。而且,我们也看到,所谓的端口,是为了区分不同的应用的,以在不同的IP包来到的时候能够正确转发。
         TCP/IP只是一个协议栈,就像操作系统的运行机制一样,必须要具体实现,同时还要提供对外的操作接口。就像操作系统会提供标准的编程接口,比如Win32编程接口一样,TCP/IP也必须对外提供编程接口,这就是Socket编程接口--原来是这么回事啊!
在Socket编程接口里,设计者提出了一个很重要的概念,那就是socket。这个socket跟文件句柄很相似,实际上在BSD系统里就是跟文件句柄一样存放在一样的进程句柄表里。这个socket其实是一个序号,表示其在句柄表中的位置。这一点,我们已经见过很多了,比如文件句柄,窗口句柄等等。这些句柄,其实是代表了系统中的某些特定的对象,用于在各种函数中作为参数传入,以对特定的对象进行操作--这其实是C语言的问题,在C++语言里,这个句柄其实就是this指针,实际就是对象指针啦。
现在我们知道,socket跟TCP/IP并没有必然的联系。Socket编程接口在设计的时候,就希望也能适应其他的网络协议。所以,socket的出现只是可以更方便的使用TCP/IP协议栈而已,其对TCP/IP进行了抽象,形成了几个最基本的函数接口。比如create,listen,accept,connect,read和write等等。
         现在我们明白,如果一个程序创建了一个socket,并让其监听80端口,其实是向TCP/IP协议栈声明了其对80端口的占有。以后,所有目标是80端口的TCP数据包都会转发给该程序(这里的程序,因为使用的是Socket编程接口,所以首先由Socket层来处理)。所谓accept函数,其实抽象的是TCP的连接建立过程。accept函数返回的新socket其实指代的是本次创建的连接,而一个连接是包括两部分信息的,一个是源IP和源端口,另一个是宿IP和宿端口。所以,accept可以产生多个不同的socket,而这些socket里包含的宿IP和宿端口是不变的,变化的只是源IP和源端口。这样的话,这些socket宿端口就可以都是80,而Socket层还是能根据源/宿对来准确地分辨出IP包和socket的归属关系,从而完成对TCP/IP协议的操作封装!而同时,放火墙的对IP包的处理规则也是清晰明了,不存在前面设想的种种复杂的情形。
         明白socket只是对TCP/IP协议栈操作的抽象,而不是简单的映射关系,这很重要!

 

另:

Socket通讯及底层TCP/IP连接原语

 

 

 

 

 

 

分享到:
评论

相关推荐

    三菱Q系列PLC之间SOCKET通讯详解.docx

    在进行Q系列PLC的SOCKET通信时,应参考《QPLC内置以太网手册》,该手册详细介绍了相关的通信设置和指令使用方法,是实施通信的重要参考资料。 总结来说,通过理解SOCKET的基本概念,合理配置硬件和软件,以及熟练...

    socket详解 socket详解 socket详解 socket详解

    Socket 编程详解 在网络编程中,Socket 是一个基本概念, plays a crucial role in building network applications. 在 C# 中,Socket 编程是通过使用 System.Net.Sockets 命名空间中的类和方法来实现的。下面,...

    windows下socket通信代码

    在Windows环境下进行网络编程时,Socket通信是一种常用的技术。Socket接口是操作系统提供的网络通信API,允许应用程序通过TCP/IP协议栈与其他计算机进行数据交换。本文将详细介绍Windows下的Socket通信代码,包括...

    linux下socket can 编程详解

    CAN总线是一种高性能的串行通信协议,它通过消除主从结构提升了通信的灵活性,可以适应非常广泛的应用场景。CAN总线能够支持高达1Mbps的传输速度,能够实现高效、可靠的网络通信。 “CAN工作原理”部分描述了CAN...

    基于VC的socket通信

    《基于VC的Socket通信详解》 在计算机网络编程中,Socket通信是一种常用的技术,它允许应用程序通过网络进行数据传输。本文将深入探讨如何在Visual C++(简称VC)环境中使用Socket进行网络通信,并以简单的代码示例...

    兄弟机床通信协议

    ### 兄弟机床通信协议详解 #### 一、概述 兄弟机床通信协议是日本兄弟公司为其实现机床间数据通信而开发的一种特定通信标准。该协议主要用于采集操作模式、运行状态、FS值(通常指进给速度)、功率等重要参数。...

    GPRS转Socket通信服务器

    《GPRS转Socket通信服务器详解》 在信息技术领域,GPRS(General Packet Radio Service)转Socket通信服务器是一种常用于远程设备通信的技术方案。GPRS是2G移动通信系统中的数据传输技术,它允许设备通过移动网络...

    Socket通信通信

    - 学习SSL/TLS等安全通信协议,增强Socket的安全性。 总的来说,"Socket通信通信"的资源为初学者提供了理解Socket编程的良好起点,通过ServerCode和ClientCode的学习,可以深入理解Socket通信的原理和实践,为...

    Delphi制作OCX通信控件(Socket通信)

    Socket通信是网络编程中一种基础且重要的技术,允许应用程序通过TCP/IP协议在不同设备间进行数据交换。 **描述详解:** 描述中提到的"OCX控件源码"是指包含了创建OCX控件的所有源代码文件,开发者可以通过阅读和...

    C# socket 通信 (客户端与服务端)

    **C# Socket通信详解** Socket通信是网络编程中的基础组件,它允许两个应用程序通过网络进行数据交换。在C#中,Socket类提供了实现客户端和服务端通信的接口。本程序是在Visual Studio 2005环境下编写并测试通过的...

    Java网络socket编程详解

    在Java中实现网络通信,主要依赖于Socket编程模型,尤其是基于TCP/IP协议的Socket通信。 首先,Socket是一个抽象概念,用于网络通信,是网络通信的端点。在Java中,可以使用***.Socket类来创建一个客户端Socket,并...

    Python与Java间Socket通信实例代码

    Python与Java间Socket通信实例代码详解 Python与Java间Socket通信是指在Python和Java两个不同的语言平台之间实现数据交换和通信的过程。Socket是Python和Java中都支持的网络通信机制,可以实现跨语言平台的通信。 ...

    socket通信相关函数

    ### Socket通信相关函数详解 #### 一、Socket 函数 **功能概述:** - `socket`函数用于创建一个新的套接字。这是进行网络通信的第一步,通过调用此函数,程序能够获得一个文件描述符(通常称为套接字描述符),...

    C#中Socket通信用法实例详解

    在C#编程语言中,Socket通信是一种常用的技术,用于实现应用程序间的网络通信。Socket接口提供了低级别的、面向连接或无连接的网络通信服务,支持TCP(Transmission Control Protocol)和UDP(User Datagram ...

    PB9实现的SOCKET通讯协议

    - SOCKET是网络编程的基本接口,它是TCP/IP协议栈的一部分,提供了进程间通信(IPC)的能力,特别是跨网络的进程间通信。 - 在PB9中实现SOCKET通讯,需要理解TCP(传输控制协议)和UDP(用户数据报协议)这两种...

    Socket 通讯协议.pdf

    **知识点详解:Socket通讯协议** ### 一、概念解析 #### 客户端(Client) 在本场景下,客户端指的是前端Creeper中的IPpushproxy组件。它负责发起与服务端的连接请求,并维持该连接的活跃状态。客户端的主要职责是...

    Linux的socket编程详解

    ### Linux的Socket编程详解 #### 一、网络中进程间通信机制 进程间通信(IPC, Inter-Process Communication)在单机系统中主要是通过管道、信号、消息队列等方式实现的。然而,当涉及到跨主机通信时,就需要解决...

    linux 中socket编程 常用结构体 详解

    Linux 中 Socket 编程常用结构体详解 Linux 中 Socket 编程常用结构体是指在 Linux 操作系统中,用于实现网络通信的结构体。这些结构体是 Socket 编程的基础,是理解 Socket 编程的关键。 首先,我们需要了解...

    php socket编程实例详解

    在开发过程中,可以借助一些工具来测试和调试Socket通信,比如Wireshark进行网络封包分析,或者使用telnet命令进行简单测试。 总之,理解并掌握PHP的Socket编程,能让你在构建高效、实时的网络应用时更加得心应手。...

    php5 实现socket 通信

    ### PHP5 实现 Socket 通信知识点详解 #### 一、Socket 概述 在计算机网络中,Socket(套接字)是一种用于网络间进程通信的机制。它为应用程序提供了访问低层传输协议的能力,比如 TCP 和 UDP。在 PHP5 中,Socket...

Global site tag (gtag.js) - Google Analytics