测试过程中,你一定遇到不少网络通信的情况,最常见的如网络语音通信、文本传输、微信QQ聊天、浏览器访问等等,这些都涉及到网络进程间通信,然而这些进程间是如何通信的呢?你一定听开发同学提过很多次socket这个东西,没错,一切都是靠Socket实现的。它为何如此神奇?下面小编做个科普,帮你揭开Socket的神秘面纱~

  1. 网络进程间通信
    要了解Socket首先要熟悉网络进程通信的原理,一个完整的网络应用程序包括客户端和服务器两个部分。网络间通信需要由两个进程组成,并且只能用同一种协议,也就是说,不能在通信的一端使用TCP协议,而另一端则用UDP协议。
    在TCP/IP协议中,两个因特网主机通过两个路由器和对应的层连接。各主机上的应用通过一些数据通道相互执行读取操作,如下图所示:

实现网络间通信,要解决一个首要问题是-如何唯一标识一个进程,在网络上,通常利用ip地址+协议+端口号唯一标示网络中的一个进程。IP层的ip地址可以唯一标示主机,而TCP层协议和端口号可以唯一标示主机的一个进程,这样它们就可以利用Socket进行通信了。
2. Socket套接字
网络中的进程是通过Socket来通信的,那么Socket是什么呢?Socket是一个进程间通信终结点,它是Socket应用程序用来在网络上发送或接收数据包的对象,是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。
如下图所示,在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

 Socket的使用类型主要有两种:
(1)流套接字(streamsocket):基于 TCP协议,采用流的方式提供可靠的字节流服务;
(2)数据报套接字(datagramsocket):基于 UDP协议,采用数据报文提供数据打包发送的服务。
  1. Socket通信流程
    Socket起源于UNIX,在Unix一切皆文件哲学的思想下,Socket是一种"打开—读/写—关闭"模式的实现,服务器和客户端各自维护一个"文件",在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。以使用TCP协议通讯的Socket为例,其交互流程大概是这样子的:

(1)服务器根据地址类型(ipv4,ipv6)、socket类型、协议创建socket;
(2)服务器为socket绑定ip地址和端口号;
(3)服务器socket监听端口号请求,随时准备接收客户端发来的连接,这时候服务器的socket并没有被打开;
(4)客户端创建socket;
(5)客户端打开socket,根据服务器ip地址和端口号试图连接服务器socket;
(6)服务器socket接收到客户端socket请求,被动打开,开始接收客户端请求,直到客户端返回连接信息。这时候socket进入阻塞状态,所谓阻塞即accept()方法一直到客户端返回连接信息后才返回,开始接收下一个客户端谅解请求;
(7)客户端连接成功,向服务器发送连接状态信息;
(8)服务器accept方法返回,连接成功;
(9)客户端向socket写入信息;
(10)服务器读取信息;
(11)客户端关闭;
(12)服务器端关闭。
以上,一次socket通信流程的交互结束。
4. 代码实现
(1)创建一个socket:socket()
int socket(int domain, int type, int protocol);

  • domain:与socket通信的domain。
  • type:socket类型,SOCK_STREAM(TCP),SOCK_DGRAM(UDP)。
  • protocol:通常指定为0,在RAW_SOCKET中为IPPROTO_RAW。
    return: 新创建socket的文件描述符。
    (2)将socket绑定到地址:bind()
    int bind(int sockfd, const struct sockaddr* addr, socklen_t addrlen);
  • sockfd:在socket()调用取得的文件描述符。
  • addr:要socket绑定到的地址。
  • addrlen:制定了地址结构的大小。
    return:-1为绑定失败。
    (3)监听接入连接:listen()
    int listen(int sockfd, int backlog);
  • sockfd:socket文件描述符。
  • backlog:限制未决连接的数量(在调用accept()前收到connect()的连接)。
    return: -1为监听失败。
    (4)接受连接:accept()
    int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
  • sockfd:socket文件描述符。
  • addr:对端socket的地址结构。
  • addrlen:对端socket地址结构的长度。
    return:和对端连接的文件描述符。
    当调用accept()时,会创建一个新的socket,并且由这个新创建的socket来与执行connect()的对等socket进行连接。
    (5)连接到对等socket:connect()
    int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
  • sockfd:socket文件描述符。
  • addr:要连接到socket的地址。
  • addrlen:地址结构的长度。
    (6)连接终止:close()
    终止一个流socket的连接,如果多个文件描述符引用了一个socket,那么所有描述符被关闭后才会终止(若调用shutdown()则可以强制关闭socket上的信道)。
  1. Socket中TCP的三次握手建立连接详解
    TCP建立连接要进行“三次握手”,即交换三个分组。大致流程如下:
    1)客户端向服务器发送一个SYN J;
    2)服务器向客户端响应一个SYN K,并对SYN J进行确认ACKJ+1;
    3)客户端再想服务器发一个确认ACK K+1。

当客户端调用connect时,触发了连接请求,向服务器发送了SYN J包,这时connect进入阻塞状态;服务器监听到连接请求,即收到SYN J包,调用accept函数接收请求向客户端发送SYN K ,ACK J+1,这时accept进入阻塞状态;客户端收到服务器的SYN K ,ACK J+1之后,这时connect返回,并对SYN K进行确认;服务器收到ACK K+1时,accept返回,至此三次握手完毕,连接建立。
6. Socket中TCP的四次握手释放连接
Socket中四次握手释放连接的过程,请看下图:
大致流程为:
1)某个应用进程首先调用close主动关闭连接,这时TCP发送一个FIN M;
2)另一端接收到FIN M之后,执行被动关闭,对这个FIN进行确认。它的接收也作为文件结束符传递给应用进程,因为FIN的接收意味着应用进程在相应的连接上再也接收不到额外数据;
3)一段时间之后,接收到文件结束符的应用进程调用close关闭它的Socket。这导致它的TCP也发送一个FIN N;
4)接收到这个FIN的源发送端TCP对它进行确认。

性能测试-socket协议相关推荐

  1. 自行控制loadrunner的socket协议性能测试 (转)

    一前言 二任务的提出 三实现方案讨论 四技术要点讲解 如何开始录制一个最简单的收发数据包脚本 写日志文件 一行一行读数据包文件 字符串转换为十六进制数据包 发送自己定义的数据包 接收数据包到自定义缓冲 ...

  2. loadrunner测试socket协议程序知识汇总

    本文转载自 http://bbs.51testing.com/thread-462017-1-1.html (出处: 51Testing软件测试论坛 ) 第1节课:为什么选用socket通过方式? 好 ...

  3. 网络协议之:socket协议详解之Datagram Socket

    文章目录 简介 什么是Datagram Socket 使用socat来创建UDP服务 使用ss命令来监控Datagram Sockets 使用nc建立和UDP Socket的连接 总结 简介 上一篇文 ...

  4. 手游-放开那三国socket协议分析

    手游-放开那三国socket协议分析 图文:a4727603 楼主本就是一个偷懒的人,玩游戏最什么的最讨厌了还要一遍遍的刷副本,于是就有了这个破解的过程 刷副本太累,想写个脱机挂自动打副本,背景交代完 ...

  5. Socket协议编程实践

    Socket协议编程实践[分布式计算] Socket之UDP和TCP 文章目录 Socket协议编程实践[分布式计算] 前言 一.什么是Socket 二.为什么要使用Socket 三.套接字 四.实验 ...

  6. socket协议基础知识

    Socket协议的形象描述 socket的英文原义是"孔"或"插座".在这里作为4BDS UNIX的进程通信机制,取后一种意思.socket非常类似于电话插座. ...

  7. cs架构接口协议(常用socket协议)与bs架构接口协议(常用http协议)

    Socket原理以及与websocket.http的区别: B/S的系统通常使用http协议进行客户端和服务器商的信息交换,C/S的系统通常使用socket协议进行信息交换 参考:https://bl ...

  8. socket协议介绍

    2019独角兽企业重金招聘Python工程师标准>>> 本文主要讲述了Socket协议脚本的基础知识和编写方法,让大家能够在短时间内快速掌握简单的Socket协议脚本的编写方法. 1 ...

  9. 【loadrunner】录制socket协议

    今天我们来对Loadrunner下socket协议的录制和录制后的脚本的简单设置 首先我们来简单的认识一下windows socket 协议 Winsock协议是作用于windows与TCP/IP协议 ...

最新文章

  1. Bert时代的创新:Bert应用模式比较及其它 | 技术头条
  2. android 分组 listview,Android实现的ListView分组布局改进示例
  3. 学习笔记(30):Python网络编程并发编程-Event事件
  4. 用vbs运行CMD不显示窗口的方法汇总
  5. 王者为什么有些服务器在维护,王者荣耀服务器正在维护中怎么回事 进不去怎么办...
  6. jqGrid的单字段查询
  7. ubuntu 下的文件搜索
  8. java对列表数据排序_如何在Java中对列表进行排序
  9. 基于springboot+vue的公益慈善捐助网站(前后端分离)
  10. vue 组件创建与销毁
  11. java 操作 led_Java中使用反射机制操作LED
  12. JAVA爬虫挖取CSDN博客文章(续)
  13. 无限循环小数四则运算_无限循环小数能做加减乘除四则运算吗?无限不循环小数能做吗??...
  14. 如何打开阿里云安全组
  15. 怎么查英文期刊,推荐一下?
  16. iPad 使用技巧:Apple Pencil
  17. 万丰科技机器人排名_中国机器人公司排名是怎样的?
  18. 使用BLoC 构建 Flutter的页面实例
  19. 【vsftpd】配置
  20. 20款 密码破解工具

热门文章

  1. 新学期新气象,开学大计划!
  2. android sdk manager安装,Android SDK Manager安装过程
  3. 一个普通程序员6年涨薪历程
  4. 静态代码扫描工具汇总
  5. 汤姆大叔JavaCript系列10阅读笔记1
  6. 杠杆交易的优势是什么?
  7. 硬盘目录损坏是什么原因?怎么恢复文件?
  8. MVC北京络捷斯特第三方物流系统技术解析(五)库内加工
  9. 【Android Training - Performance】提高显示布局文件的性能[Lesson 3 - 按需载入视图(ViewStub的使用方法)]
  10. linux 清理缓存