套接字:Socket
在进行通信之前,一般要先建立Socket连接,Socket编程是端到端的通信,往往意识不到中间经过了多少局域网,多少路由器,他能操作的是端到端协议之上的网络层和传输层。
在网络层,Socket函数可以指定使用IPV4(AF_INET)或者IPV6(AF_INET6),还可以指定传输层协议使用TCP(SOCK_STREAM)还是UDP(SOCK_DGRAM)。
1. 基于TCP的Socket函数的调用过程
a. 调用 bind 函数,给这个Socket赋予一个IP和端口(绑定IP是因为机器可能有多个网卡,绑定端口是确定进程);
b. 调用 listen 函数进行监听;
内核中每个socket维护两个队列:一个已经建立连接的队列(三次握手完毕,处于established状态),一个还没有完全建立连接的队列(三次握手尚未完成,处于syn_rcvd状态)。
服务端监听时,客户端可通过 connect 函数发起连接,三次握手时,内核会给客户端分配一个临时端口,握手成功后服务端的accept返回另一个socket。
监听的socket和传输数据的socket是两个socket,前者叫做监听socket,后者叫做已连接socket。
为什么需要两个socket?为了复用监听socket,提高性能。
c. 服务端调用 accept 函数,拿出一个已经完成连接进行处理;
d. 连接建立成功后,双方通过read和write函数读写数据;
1.1 socket 结构
TCP的socket就是一个文件流,Linux中socket就是以文件的形式存在的。初次之外还存在文件描述符,写入和读出也是通过文件描述符。
每个进程都有有一个数据结构 task_struc,里面指向一个文件描述符数组(fds),列出这个进程打开的所有文件的文件描述符。文件描述符是一个整数,是这个数组的下标。
数组中的内容是一个指针,指向内核中所有打开的文件的列表(file list);
每个文件都有一个 inode,普通文件的inode保存在硬盘上,socket的inode保存在内存中;
在这个inode中,指向了socket在内核中的 socket结构;
socket主要是一个发送队列和接收队列,两个队列里面保存的是一个缓存sk_buff。这个缓存里面可以看到完整的包结构。
下面是一个整体的结构图。

2. 基于UDP的Socket函数的调用过程
a. bind 一个IP和端口号;
b. 不需要维护连接状态,一个socket就可以和多个客户端通信;
c. 没有连接状态,所以每次通信都调用 sendto 和 recvfrom,都可以传入IP和端口;

3. 连接的处理方式
3.1 多进程方式
Linux下通过fork子进程,让子进程去处理socket,在Linux内核中,会复制文件描述符列表,内存空间,当前程序执行到哪一行的记录;
fork()子进程后会返回一个整数,代表子进程的ID;
进程调用fork函数时,返回0代表为子进程,返回其他整数代表为父进程;

3.2 多线程方式
在Linux下,通过pthread_create创建一个线程,也是调用do_fork。

3.3 IO多路复用,一个线程维护多个socket(轮询)
一个线程监听全部的socket,通过select函数监听文件描述符集合,
一旦有变化,就依次查看每个文件描述符,
将发生变化的文件描述符在fd_set对应的位设置为1 ,表示socket可读或者可写,
然后继续监听;
3.4 IO多路复用,基于事件通知
事件通知在Linux中通过epoll函数实现,通过注册callback函数的方式,某个文件描述符发生变化时主动通知。
Linux中通过epoll_create创建epoll对象,它本身也是一个文件,它里面有一个红黑树结构,保存着监听的所有socket;
当epoll_ctl添加一个socket的时候,其实是加入这个红黑树,同时红黑树的节点指向一个结构,这个结构挂在被监听的socket事件列表中。
当一个socket来了一个事件之后,可以在这个列表中得到epoll对象,并调用callback通知他。

套接字:Socket的更多相关文章
- Linux进程间通信(八):流套接字 socket()、bind()、listen()、accept()、connect()、read()、write()、close()
前面说到的进程间的通信,所通信的进程都是在同一台计算机上的,而使用socket进行通信的进程可以是同一台计算机的进程,也是可以是通过网络连接起来的不同计算机上的进程.通常我们使用socket进行网络编 ...
- Linux进程间通信(九):数据报套接字 socket()、bind()、sendto()、recvfrom()、close()
前一篇文章,Linux进程间通信——使用流套接字介绍了一些有关socket(套接字)的一些基本内容,并讲解了流套接字的使用,这篇文章将会给大家讲讲,数据报套接字的使用. 一.简单回顾——什么是数据报套 ...
- 套接字socket 的地址族和类型、工作原理、创建过程
注:本分类下文章大多整理自<深入分析linux内核源代码>一书,另有参考其他一些资料如<linux内核完全剖析>.<linux c 编程一站式学习>等,只是为了更好 ...
- [置顶] Java套接字Socket编程
1)概念 网络编程基本模型就客户端到服务器的模型,也就是我们常见的C/S模型.简单的说就是两个进程间相互通信的过程.即通信双方一方作为服务器等待客户端提出请求并给以回应,另一方作为客户端向服务器提出请 ...
- Java网络编程--套接字Socket
一.套接字Socket IP地址标志Internet上的计算机,端口号标志正在计算机上运行的进程(程序). 端口号被规定为一个16位的0--65535之间的整数,其中,0--1023被预先定义的服务通 ...
- 套接字编程,创建套接字socket
1.套接字地址结构: struct sockaddr { sa_family_t sa_family; char sa_data[14]; }; 其中,成员sa_family表示套接字的协议族类型,对 ...
- 什么是套接字(Socket)
应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题.多个TCP连接或多个应用程序进程可能需要 通过同一个TCP协议端口传输数据.为了区别不同的应用程序进程和连 ...
- Java套接字Socket编程--TCP参数
在Java的Socket中,主要包含了以下可设置的TCP参数. 属性 说明 默认值 SO_TIMEOUT 对ServerSocket来说表示等待连接的最长空等待时间; 对Socket来说表示读数据最长 ...
- pythonl练习笔记——PythonNet 套接字socket
1 套接字socket 1.1 套接字概述 套接字,一种网络通讯工具:用于进行网络间的通信,是一种特殊文件类型, 套接字,是一个通信链的句柄,用于描述IP地址和端口,实现向网络发出请求或应答网络请求. ...
- 面向对象之套接字(socket)和黏包
一丶套接字(socket) tcp是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端 基于UDP协议的socket server端: import socket udp_sk = socke ...
随机推荐
- unity中的构造函数
避免使用构造函数 不要在构造函数中初始化任何变量,使用Awake或Start实现这个目的.即使是在编辑模式中Unity也自动调用构造函数,这通常发生在一个脚本被编译之后,因为需要调用构造函数来取向一个 ...
- php->是什么意思
在php中经常会看到这种符号,但是不明白是什么意思,有没有细心点的朋友帮讲讲,请不要说看手册之类的话.如果真给我讲明白了,我还会有加分的哦!比如这个中的符号是什么意思:$sql=$mydami-> ...
- jq页面加载分割截图
<script> $(document).ready(function() { if (!Array.prototype.forEach) { Array.prototype.forEac ...
- 总结一下《vue的使用》
1.用vue创建项目的时候, 1.安装axios,对axios进行处理,创建axios.js文件,设置基础请求地址, 设置前置守卫和独享守卫,对请求数据进行设置,(特别实在进行token验证的时候特别 ...
- 关于DOM级别的一些问题,DOM0,DOM1,DOM2
之前看书没太注意这个问题,直到我今天看书看到一个DOM0级,于是我就在群里问了下各个级别的意思区别.. 首先我们的确定标准了是没有DOM0级的.在平时阅读的时候可能会读到DOM0级(DOM Level ...
- printk()、查看开机log、查看实时log
要将linux内核的带级别控制的printk内容打印出来,在命令行 输入 dmesg -n 8 就将所有级别的信息都打印出来 Linux命令:dmesg 功能说明:显示开机信息. 语 法:dmesg ...
- 百度Web Uploader组件实现文件上传之分片上传(一)
当网络问题导致传输错误时,只需要重传出错分片,而不是整个文件.另外分片传输能够更加实时的跟踪上传进度.多的不说了直接怼代码 前端是三个监听:一个是获取md5,一个是分片,最后一个是合并代码 <! ...
- poj 2506 Tiling(高精度)
Description In how many ways can you tile a 2xn rectangle by 2x1 or 2x2 tiles? Here is a sample tili ...
- C++类、继承、多态、虚函数
一个比较好的虚函数例子 /****************************/ /* 作者:骆天 */ /* 时间:2018/1/26 */ /* 代码:多态的理解 */ /********** ...
- Ng第四课:多变量线性回归(Linear Regression with Multiple Variables)
4.1 多维特征 4.2 多变量梯度下降 4.3 梯度下降法实践 1-特征缩放 4.4 梯度下降法实践 2-学习率 4.5 特征和多项式回归 4.6 正规方程 4.7 正规方程及不可逆性 ...