`
春花秋月何时了
  • 浏览: 41783 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Socket原理探索

阅读更多

 

1、网络进程通信之socket

在使用TCP/IP协议族进行网络通信的过程中,网络层的IP地址可以唯一标识一台网络主机,而传输层的协议+端口可以唯一标识主机中的应用程序进程,利用这样的三元组合(IP地址,协议,端口)就可以在网络中唯一标识网络中的进程,从而为进程在网络中的通信建立了基石。

TCP/IP协议族为网络通信提供了编程接口,Socket正是其代表,Socket起源于Unix,在Unix一切皆文件哲学的思想下,socket是一种"打开—读/写—关闭"模式的实现,服务器和客户端各自维护一个"文件",socket可以视为这个文件的句柄或者称之为文件描述符,在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。

socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。socket在通信模型中的角色与位置如下图:

 

2、socket如何进行通信

建立socket通信需要用到五大元素(协议,源IP,源端口,目的IP,目的端口),只要保证这样的五元组合唯一便能建立socket通信连接。

其通信建立的过程大致为:1)服务端初始化socket,与端口(例如8080)绑定(bind),端口监听(listen),调用accept等待客户端连接。2)客户端初始化socket,客户端随机分配一个端口(例如6688)发起对服务端监听端口(8080)的连接(connect),服务端IP层收到请求之后,根据具体协议类型交由传输层协议栈处理,传输层再交由socket层处理,socket层以监听端口(8080)作为服务端端口建立与客户端的连接,创建新的socket实例(该实例包含客户端IP,客户端端口6688,服务端端口8080,服务端IP)用于标识此次连接的服务端句柄,并将其放进连接队列(连接队列的大小是由服务端listen之时指定的,一旦连接数达到限制,将会拒绝或者延迟新的连接请求)。

连接建立之后,两端可以通过各自的终端句柄socket实例(因为其包含有socket通信的五元组合)进行数据传输(客户端仍然向服务端的8080端口发送数据),目的端主机的传输层接收到数据之后,仍然交由socket层处理,socket层根据源/宿对准确的分辨出数据包与socket实例的归属关系。通信图示如下:

 

 

 

 3、socket建立/关闭连接的三次握手与四次挥手

建立连接的三次握手如下图:



 

 

 这三次握手详细流程大致为:

  1. 客户端socket对象connect调用之后进行阻塞,此过程发送了一个SYN(同步序列编号Synchronize Sequence Numbers)。
  2. 服务端监听到连接请求,如果请求被允许,便向客户端发送对收到的SYN的确认包ACK,同时自己也会发送一个SYN。此时accept仍然处于阻塞状态。
  3. 客户端收到SYN+ACK之后,connect返回,并向服务端发送ACK确认包,服务端收到之后,accept返回,连接建立成功。

 关闭连接的四次挥手如下图:



 

 这四次握手详细流程大致为:

  1. 某端首先调用close主动关闭连接,这时TCP向另一端发送一个FIN M包。
  2. 另一端的read返回0表面收到了FIN段,就知道另一端关闭了连接,那么首先发送一个对FIN的确认包ACK
  3. 发送确认包之后,也调用close关闭连接,从而导致它的TCP也会发送一个FIN N包。
  4. 接收到这个FIN的源端TCP最后发出确认包ACK,完成四次握手。

注意:任何一方调用close()后,连接的两个传输方向都关闭,不能再发送数据了。如果一方调用shutdown()则连接处于半关闭状态,仍可接收对方发来的数据。

  • 大小: 78.6 KB
  • 大小: 67.6 KB
  • 大小: 8.8 KB
  • 大小: 37.7 KB
  • 大小: 41.1 KB
  • 大小: 10.1 KB
  • 大小: 40.7 KB
  • 大小: 65.5 KB
  • 大小: 50.1 KB
  • 大小: 38.8 KB
  • 大小: 58.3 KB
  • 大小: 22 KB
  • 大小: 13.5 KB
  • 大小: 11.7 KB
分享到:
评论

相关推荐

    用Socket实现基于TCP和UDP的原理探索.pdf

    ### 用Socket实现基于TCP和UDP的原理探索 #### 一、Socket的定义与工作原理 Socket,中文译作“套接字”,是传输层提供的网络进程通信接口。它能够封装不同通信协议族系间的差异,以及同一族系内不同传输层协议...

    socketdemo 一个用来学习socket入门的例子

    SocketDemo 是一个专门为Java初学者设计的用于学习和理解Socket通信基础的实例项目。Socket编程是网络编程的重要组成部分,它提供了进程间通过网络进行...不断练习和探索,你将能够熟练地运用Socket编程解决实际问题。

    C# Socket入门学习! Socket入门学习! Socket入门学习!

    本文将深入探讨C# Socket入门学习的关键知识点,帮助初学者理解并掌握Socket编程的基本原理和实践。 1. **什么是Socket?** Socket是网络通信中的一个接口,它允许两个程序通过网络交换数据。在C#中,Socket类是...

    socket

    在本篇内容中,我们将详细介绍Socket编程的基本概念、工作原理以及一个简单的C++ Socket编程示例。 ### Socket编程基本概念 #### 1. **什么是Socket?** - Socket(套接字)是一种用于进程间通信的机制,它允许...

    supersocket基本类库与测试

    通过调试这些项目,开发者可以深入理解Socket通信的工作原理,以及SuperSocket如何简化这一过程。 标签“supersocket”进一步确认了这个压缩包与SuperSocket框架相关,可能包含的文件可能有: 1. 服务端应用程序源...

    delphi API实现socket通信示例

    学习这个示例,初学者不仅可以理解Delphi中Socket通信的基本原理,还能了解到如何使用API函数进行低级别网络编程。此外,这个例子也可以作为基础,进一步探索多线程处理、异步通信、错误处理等高级主题。 总之,...

    HP用SOCKET实现(客户端---服务端)

    此外,还可以探索异步Socket编程,以支持高并发环境下的通信需求。 总之,掌握PHP中的Socket编程,为我们提供了构建网络应用程序的强大工具,无论是开发小型项目还是大型系统,都是不可或缺的技能之一。

    简单的socket聊天室

    学习这个项目,你可以理解Socket通信的基本原理,熟悉如何使用Python进行网络编程,包括数据的发送和接收,以及多线程或多进程处理并发连接。此外,你还可以了解到如何处理客户端断开连接的情况,以及如何实现简单的...

    PHP和SOCKET

    #### 二、Socket编程的基本原理 ##### 1. 基础概念 - **Socket**:在计算机网络中,Socket是一种用于网络通信的端点抽象,可以理解为网络上两个进程间的一个接口。它提供了网络通信的能力,使程序可以通过网络发送...

    socket通信客户端实例

    本文将详细解析“socket通信客户端实例”,旨在帮助初学者理解并掌握Socket通信的基本原理和应用。 1. **Socket基本概念** - Socket,通常称为套接字,是操作系统提供的一种通信接口,它允许两个进程通过网络进行...

    HP Socket 测试案例 仅供参考 初级使用

    本测试案例专注于HP Socket的初级使用,旨在帮助初学者理解和实践Socket通信的基本原理和操作。以下将详细阐述Socket测试的相关知识点。 首先,让我们了解什么是Socket。Socket,又称为“套接字”,是网络编程中的...

    基于Linux的Socket网络编程的性能优化

    本文将详细介绍在Linux环境下Socket网络编程的基本原理、流程以及如何通过一系列优化措施提升其性能。 #### 二、Socket概述 在Linux系统中,网络编程主要通过Socket接口实现,这是一种特殊的I/O操作形式,其实质是...

    HP_SOCKET-2.3.1

    《HP_SOCKET-2.3.1:探索IOCP与Socket Server的卓越性能》 HP_SOCKET-2.3.1是一个专为Windows平台设计的高性能、基于IOCP(I/O完成端口,Input/Output Completion Port)技术的开源Socket服务器框架。这个版本...

    JAVA-socket开发指南

    接下来,你可以进一步探索更多高级主题,如加密传输、错误处理等,以便在实际项目中更加灵活地使用Socket编程。 #### 九、附录 如果你在学习过程中遇到问题,可以通过以下方式联系作者寻求帮助: - Roy Miller: ...

    C#SocketDemo.zip

    源码的提供意味着我们可以深入研究其工作原理,这对于学习网络编程,尤其是C#中的Socket编程非常有价值。"vs打开项目即可运行"提示我们,这个项目是在Visual Studio环境中创建的,可以通过这个IDE直接加载并运行。 ...

    socket.io的demo

    Socket.IO 是一个实时应用框架,它为开发人员提供了一种简单的方式来实现实时、双向通信。这个框架在Web上广泛...同时,这也是一个很好的起点,可以帮助你进一步探索更多复杂的实时应用功能,比如群聊、文件传输等。

    java socket编程实例(出自《java大学教程》)

    你可以通过调试和修改`SocketTest`代码,进一步探索和实践Socket编程的不同场景,如文件传输、聊天应用等。在实践中,你将遇到并发控制、错误处理、网络协议解析等更多复杂问题,这些都是提升Java网络编程技能的关键...

    linux系统下socket编程详解教程

    在Linux系统下进行Socket编程是理解网络通信机制的关键步骤,尤其对于初学者而言,掌握这一技术能够开启深入探索网络编程的大门。以下是对标题“Linux系统下Socket编程详解教程”及描述“Linux下socket编程,适合...

Global site tag (gtag.js) - Google Analytics