socket函数

Netty实践与NIO原理

风格不统一 提交于 2019-12-31 00:43:23
一、阻塞IO与非阻塞IO Linux网络IO模型(5种) (1)阻塞IO模型 所有文件操作都是阻塞的,以套接字接口为例,在进程空间中调用recvfrom,系统调用直到数据包到达且被复制到应用进程缓冲区或发生错误时才返回,期间会一直等待(阻塞)。模型如图: (2)非阻塞IO模型 recvfrom从应用层到内核时,如果该缓冲区没数据,直接返回一个EWOULDBLOCK错误,反复轮询检查这个状态,看是否有数据到来。如图: (3)IO复用模型 Linux提高select/poll,进程通过将一个或多个fd(file descriptor)传递给select或poll系统调用,阻塞在select操作上,侦测多个fd是否处于就绪状态。select/poll顺序扫描fd是否就绪,而且支持的fd数量有限。Linux还提供了一个epoll系统调用,使用基于事件驱动的方式代替顺序扫描,性能更高。当有fd就绪时,立即回调函数rollback。如图: (4)信号驱动IO模型 首先开启套接口信号驱动IO功能,通过系统调用sigaction执行一个信号处理函数,该函数立即返回,进程继续工作,它是非阻塞的。当数据准备就绪时,就为该进程生成一个SIGIO信号,通过信号回调通知应用程序调用recfrom来读取数据,通知主循环函数处理数据。如图: (5)异步IO模型 告知内核启动某个操作,让内核在整个操作完成后

TCP和UDP的区别

纵饮孤独 提交于 2019-12-26 23:58:38
转载至: https://www.cnblogs.com/steven520213/p/8005258.html TCP和UDP是OSI模型中的运输层中的协议。TCP提供可靠的通信传输,而UDP则常被用于广播和细节控制交给应用的通信传输 UDP(User Datagram Protocol) UDP不提供复杂的控制机制,利用IP提供面向无连接的通信服务。并且它是将应用程序发来的数据在收到的那一刻,立刻按照原样发送到网络上的一种机制。 即使是出现网络拥堵的情况下,UDP也无法进行流量控制等避免网络拥塞的行为。此外,传输途中如果出现了丢包,UDP也不负责重发。甚至当出现包的到达顺序乱掉时也没有纠正的功能。如果需要这些细节控制,那么不得不交给由采用UDP的应用程序去处理。换句话说,UDP将部分控制转移到应用程序去处理,自己却只提供作为传输层协议的最基本功能。UDP有点类似于用户说什么听什么的机制,但是需要用户充分考虑好上层协议类型并制作相应的应用程序。 TCP(Transmission Control Protocol) TCP充分实现了数据传输时各种控制功能,可以进行丢包的重发控制,还可以对次序乱掉的分包进行顺序控制。而这些在UDP中都没有。此外,TCP作为一种面向有连接的协议,只有在确认通信对端存在时才会发送数据,从而可以控制通信流量的浪费。TCP通过检验、序列号、确认应答、重发控制

深入理解TCP协议及其源代码——send和recv背后数据的收发过程

☆樱花仙子☆ 提交于 2019-12-26 18:10:36
TCP数据发送和接收的原理 TCP连接的建立过程 TCP Socket的连接的过程是服务端先通过 socket() 函数创建一个socket对象,生成一个socket文件描述符,然后通过 bind() 函数将生成的socket绑定到要监听的地址和端口上面。绑定好了之后,使用 listen() 函数来监听相应的端口。而客户端是在通过 socket() 函数创建一个socket对象之后,通过 connect() 函数向被服务端监听的socket发起一个连接请求,即发起一次TCP连接的三次握手。接下来就可以就可以通过TCP连接收发数据了。 Socket中 send() 和 recv() 为了实现数据的收发,每个TCP socket在内核中都维护了一个发送缓冲区和一个接收缓冲区, send() 函数把应用缓冲区中的数据拷贝到TCP发送缓冲区中,接下来的发送过程由TCP负责; recv() 函数是将TCP接收缓冲区中的数据拷贝到应用缓冲区中。在socket中, send() 和 recv() 只管拷贝,真正的发送和接收是由TCP连接负责的。接下来我们看看TCP连接是如何实现数据收发的。 TCP连接中的数据收发 追踪socket中的 __sys_sendto 和 __sys_recvfrom 函数 实验环境的准备参考 构建调试Linux内核网络代码的环境MenuOS系统 $ cd ~

截获 Windows socket API

女生的网名这么多〃 提交于 2019-12-26 15:45:39
1、前言 本文主要介绍了如何实现替换Windows上的API函数,实现 Windows API Hook (当然,对于socket的Hook只是其中的一种特例)。这种Hook API技术被广泛的采用在一些领域中,如 屏幕取词 , 个人防火墙 等。 这种 API Hook技术 并不是很新,但是涉及的领域比较宽广,要想做好有一定的技术难度。本文是采集了不少达人的以前资料并结合自己的实验得出的心得体会,在这里进行总结发表,希望能够给广大的读者提供参考,达到抛砖引玉的结果。 2、问题 最近和同学讨论如何构建一个Windows上的简单的个人防火墙。后来讨论涉及到了如何让 进程 关联 套接字端口 ,替换windows API,屏幕取词等技术。 其中主要的问题有: 1) 采用何种机制来截获 socket 的调用? 一般来说, 实现截获socket的方法有很多很多,最基本的,可以写 驱动 , 驱动 也有很多种, TDI驱动, NDIS驱动,Mini port驱动 …。由于我使用的是Win2000系统,所以截获socket也可以用Windows SPI来进行。另外一种就是 Windows API Hook 技术。 由于我没什么硬件基础,不会写驱动 ,所以第一种方法没有考虑,而用SPI相对比较简单。但是后来觉得Windows API Hook适应面更广,而且觉得自己动手能学到不少东西,就决定用

深入理解TCP协议及其源代码

旧巷老猫 提交于 2019-12-26 15:37:51
1.TCP建立连接的三次握手   TCP是一个面向连接的协议,无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接,所谓三次握手(Three-Way Handshake)即建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。 在socket编程中,这一过程由客户端执行connect来触发 ,整个流程如下图所示: (1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。 (2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。 (3)第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。 简单来说,就是:   1

深入理解TCP协议及其源代码

浪子不回头ぞ 提交于 2019-12-25 22:55:17
一、三次握手过程   在 TCP/IP协议中, TCP协议提供可靠的连接服务,采用三次握手建立一个连接。如下图所示:   首先,客户端开始的时候,首先创建sock文件描述符,接着就进行connect发起连接服务器请求,阻塞等待服务器应答。   接着,服务器开始的时候,分配一个listen_sock文件描述符,接着进行bind绑定,绑定完毕之后进行listen监听,最后进行accept,此时阻塞等待客户端的连接。连接建立accept返回之后,分配一个新的文件描述符与客户端通信。   第一次握手:Client先产生一个初始序列号seq:8000,SYN标志位置1,将该数据包发送给Server端,之后Client端进入SYN_SENT状态,等待Client确认。   第二次握手:Server收到数据包后也发送自己的SYN报文作为响应,并初始化序列号seq=15000,为了确认Client的seq,Server将Client发送的seq加1作为ACK发送给Client,Server进入SYN_RCVD状态。   第三次握手:为了确认Server的SYN,Client将Server发送的seq加1作为ACK发送给Server。Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。   通过这样的三次握手

Socket网络编程--简单Web服务器(2)

*爱你&永不变心* 提交于 2019-12-24 22:25:09
  上一小节通过阅读开源的Web服务器--tinyhttpd。大概知道了一次交互的请求信息和应答信息的具体过程。接下来我就自己简单的实现一个Web服务器。   下面这个程序只是实现一个简单的框架出来。这次先实现能够Accept客户端的请求。   简单创建web服务器   webserver.h 1 #include <iostream> 2 #include <string> 3 #include <string.h> 4 #include <stdio.h> 5 #include <stdlib.h> 6 #include <errno.h> 7 #include <sys/types.h> 8 #include <sys/socket.h> 9 #include <netinet/in.h> 10 #include <arpa/inet.h> 11 #include <unistd.h> 12 #include <pthread.h> 13 #include <thread>//使用c++11的多线程 14 15 using namespace std; 16 17 class WebServer 18 { 19 public: 20 WebServer(); 21 ~WebServer(); 22 int ServerInit(u_short port); 23 int

socket创建和结束

自作多情 提交于 2019-12-24 07:09:38
什么是进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是 操作系统 结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。 狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed)。 广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是 操作系统 动态执行的 基本单元 ,在传统的 操作系统 中,进程既是基本的 分配单元 ,也是基本的执行单元。 第一,进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。 第二,进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之),它才能成为一个活动的实体,我们称其为进程。[3] 进程是操作系统中最基本、重要的概念。是多道程序系统出现后

PHP FPM源代码反刍品味之三: 多进程模型

馋奶兔 提交于 2019-12-24 06:52:54
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 本文开始会涉及写源代码, FPM源代码目录位于PHP源代码目录下的sapi/fpm FPM多进程轮廓: FPM大致的多进程模型就是:一个master进程,多个worker进程. master进程负责管理调度,worker进程负责处理客户端(nginx)的请求. master负责创建并监听(listen)网络连接,worker负责接受(accept)网络连接. 对于一个工作池,只有一个监听socket, 多个worker共用一个监听socket. master进程与worker进程之间,通过信号(signals)和管道(pipe)通信. FPM支持多个工作池(worker pool), FPM的工作池可以简单的理解为监听多个网络的多个FPM实例,只不过多个池都由一个master进程管理. 这里只考虑一个工作池的情况,理解了一个工作池,多个工作池也容易. fork()函数 Unix类操作系统通过fork调用新建子进程. int pid = fork(); fork函数,可以简单的理解为克隆一份进程,包含全局变量的复制. 父子进程几乎一模一样,是两个独立的进程,两个进程使用同一份代码.在fork之前运行的代码也一样. 两个进程之所以拥有不同的功能.主要就是在fork之后,父进程返回的子进程pid(大于零)

轻量级网络库libevent初探

一曲冷凌霜 提交于 2019-12-23 03:48:09
  本文是关于libevent库第一篇博文,主要由例子来说明如何利用该库。后续博文再深入研究该库原理。 libevent库简介   就如 libevent官网 上所写的“libevent - an event notification library”,libevent就是一个基于事件通知机制的库,支持/dev/poll、kqueue、event ports、select、poll和epoll事件机制,也因此它是一个跨操作系统的库(支持Linux、*BSD、Mac OS X、Solaris、Windows等)。目前应用该库的有Chromium、Memcached、NTP、tmux等应用。   libevent 库实际上没有更换select()、poll()或其他机制的基础,而是使用对于每个平台最高效的高性能解决方案,在其实现外加上一个包装器。   为了实际处理每个请求,libevent 库提供一种事件机制,它作为底层网络后端的包装器。事件系统让为连接添加处理函数变得非常简便,同时降低了底层 I/O 复杂性。这是 libevent 系统的核心。   libevent 库的其他组件提供其他功能,包括缓冲的事件系统(用于缓冲发送到客户端/从客户端接收的数据)以及 HTTP、DNS 和 RPC 系统的核心实现。   另外,libevent库非常轻量级,这让我们学习它的源码难度低了不少