热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

asp.coreapi通过socket和服务器通信发送udp_socket网络编程通信(一)

TCP与UDP简单介绍TCP(TransmissionControlProtocol传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。当客户和服务器彼此交换数据前
TCP与UDP简单介绍

TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。

UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。

sokcet/swoole/workman技术交流群:604438441

TCP与UDP在OSI的位置
2b8a358706574817aa4a2f393b4e3180
df5cc9e683e44f0ea65d5e4c2d44af2f
TCP的三次握手 数据传输以及四次分手
173e9adbee3944c0a0a9a397aab5eb35

URG: 标识紧急指针是否有效

ACK: 标识确认序号是否有效

PSH: 用来提示接收端应用程序立刻将数据从tcp缓冲区读走

RST: 要求重新建立连接. 我们把含有RST标识的报文称为复位报文段

SYN: 请求建立连接. 我们把含有SYN标识的报文称为同步报文段

FIN: 通知对端, 本端即将关闭. 我们把含有FIN标识的报文称为结束报文段

TCP的三次握手

第一次握手:建立连接。客户端发送连接请求报文段,将SYN位置为1,Sequence Number为x;然后,客户端进入SYN_SEND状态,等待服务器的确认;

第二次握手:服务器收到SYN报文段。服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置Acknowledgment Number为x+1(Sequence Number+1);同时,自己自己还要发送SYN请求信息,将SYN位置为1,Sequence Number为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK报文段。然后将Acknowledgment Number设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。

四次分手

第一次分手:主机1(可以使客户端,也可以是服务器端),设置Sequence Number和Acknowledgment Number,向主机2发送一个FIN报文段;此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了;

第二次分手:主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment Number为Sequence Number加1;主机1进入FIN_WAIT_2状态;主机2告诉主机1,我也没有数据要发送了,可以进行关闭连接了;

第三次分手:主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入CLOSE_WAIT状态;

第四次分手:主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。

TCP与UDP与网络协议
a03159e813cd4620947e732613b823aa

使用TCP的协议:

http 80 ftp 20 21 telnet 23 ssh 22 smtp 25

使用UDP协议:

tftp 69 dhcp 67 68 snmp 161 162

dns tcp udp 53

TCP与UDP区别总结

1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接

2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付

Tcp通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。

3、UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。

4.每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信

5、TCP对系统资源要求较多,UDP对系统资源要求较少。

网络中是如何通信数据传输?

ip+端口+协议

实现网络进程之间的通信,几乎所有的应用程序都是采用socket,“一切皆socket”。

HTTP TCP SOCKET 区别

Http协议:对应于应用层。Http协议是基于TCP链接的。

tcp协议:对应于传输层

ip协议: 对应与网络层

TCP/IP是传输层协议,主要解决数据如何在网络中传输;而Http是应用层协议,主要解决如何包装数据。

Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。

Http连接:http连接就是所谓的短连接,及客户端向服务器发送一次请求,服务器端相应后连接即会断掉。

socket连接:socket连接及时所谓的长连接,理论上客户端和服务端一旦建立连接,则不会主动断掉;但是由于各种环境因素可能会是连接断开,比如说:服务器端或客户端主机down了,网络故障,或者两者之间长时间没有数据传输,网络防火墙可能会断开该链接已释放网络资源。所以当一个socket连接中没有数据的传输,那么为了位置连续的连接需要发送心跳消息,具体心跳消息格式是开发者自己定义的。

什么是socket?

Socket的英文原义是“孔”或“插座”,通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

socket连接的3个步骤

(1)服务器监听:ip+端口号

(2)客户端请求:发出向 服务器 的 ip以及端口连接请求

(3)连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

PHP之socket的安装准备

linux系统

编译PHP时必须在配置中添加--enable-sockets 配置项来启用。

可以使用 lnmp一键安装包:https://github.com/lampol

windows (不推荐使用,这里不介绍)

socket的简单的demo演示

server.php$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);socket_bind($socket,'0.0.0.0',6666);socket_listen($socket);$sock = socket_accept($socket);$res = socket_read($sock,2048);echo $res;socket_write($sock,'hello client’);client.php$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);socket_connect($socket,'127.0.0.1',6666);$msg = 'hlllo server';socket_write($socket,$msg);$res = socket_read($socket,2048);echo $res;

首先运行: php server.php

9975d180c2654f4b8f505c4ae1df2cc8

然后 在运行 php client.php

c12c68459d494839b6938d8c3e9f60c2
socket常用函数的介绍

官方文档:http://php.net/manual/zh/book.sockets.php

//创建一个套接字(通讯节点)resource socket_create ( int $domain , int $type , int $protocol ) //获取错误码$errcode = socket_last_error(); //获取错误信息 根据错误码$errmsg = socket_strerror($errcode);//绑定套接字资源 地址 以及端口bool socket_bind ( resource $socket , string $address [, int $port = 0 ] )socket 用 socket_create() 创建的一个有效的套接字资源。address 如果套接字是 AF_INET 族,那么 address 必须是一个四点分法的 IP 地址(例如 127.0.0.1 )。如果套接字是 AF_UNIX 族,那么 address 是 Unix 套接字一部分(例如 /tmp/my.sock )port (可选) 参数 port 仅仅用于 AF_INET 套接字连接的时候,并且指定连接中需要监听的端口号。//监听被绑定的socket 地址端口bool socket_listen ( resource $socket [, int $backlog = 0 ] )//接受客户端的连接 阻塞的resource socket_accept ( resource $socket )//连接指定的套接字资源bool socket_connect ( resource $socket , string $address [, int $port = 0 ] )//传数据到套接字int socket_write ( resource $socket , string $buffer [, int $length = 0 ] )int socket_send ( resource $socket , string $buf , int $len , int $flags )//读取 socket 传过来的数据string socket_read ( resource $socket , int $length [, int $type = PHP_BINARY_READ ] )//注意:server端的 应该是 accept 返回的资源int socket_recv ( resource $socket , string &$buf , int $len , int $flags )//关闭套接字 资源void socket_close ( resource $socket )//获取连接过来的客户端ip地址和端口 socket 连接过来的套接字资源socket_getpeername ( resource $socket , string &$address [, int &$port ] )//设置套接字选项socket_set_option ( resource $socket , int $level , int $optname , mixed $optval )$socket socket_create或者socket_accept的函数返回值$level 这个值 SOL_SOCKET$optnameSO_REUSEADDR 是让套接字端口释放后立即就可以被再次使用SO_RCVTIMEO 是套接字的接收资源的最大超时时间SO_SNDTIMEO 是套接字的发送资源的最大超时时间$optval参数3假如是后两个,则参数4是一个这样的数组array('sec'=>1,'usec'=>500000),如果是第一个 就是true 或者false//获取套接字选项socket_get_option ( resource $socket , int $level , int $optname )//实现io多路复用 返回活跃的连接socket_select ( array &$read , array &$write , array &$except , int $tv_sec [, int $tv_usec = 0 ] )注意 :前三个参数都是引用传值。$read 服务端监听的套接字资源,当它有变化(就是有新消息到或者有客户端连接/断开)时,socket_select函数才会返回,继续往下执行。$write是监听是否有客户端写数据,传入NULL是不关心是否有写变化。$except是$sockets里面要被排除的元素,传入NULL是”监听”全部。第四个参数为null为阻塞, 为0位非阻塞, 为 >0 为等待时间返回 活跃的链接数 当有连接 或数据操作时就会返回



推荐阅读
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • c# java socketn 字节流_C#Socket编程详解(一)TCP与UDP简介
    一、TCP与UDP(转载)1、TCP1.1定义TCP(TransmissionControlProtocol)传输控制协议。是一种可靠的、面向连接的协议(eg:打电话)、传输效率低 ... [详细]
  • 三小时掌握计算机网络基础(通俗易懂)
    目录1.网络层次划分2.OSI七层网络模型3.IP地址4.子网掩码及网络划分5.ARPRARP协议6.路由选择协议7.TCPIP协议8.UDP协议 9.DNS协议 ... [详细]
  • 邮件服务在网络里的角色是越来越重要,不管是因特网上还是在局域网内部,用户都习惯使用电子邮件来处理日常的工作。而越来越多的企业和单位,也都急切希望能拥有自己的内部邮件服务器,以加强员 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • 三、寻找恶意IP并用iptables禁止掉找出恶意连接你的服务器80端口的IP,直接用iptables来drop掉它;这里建议写脚本来运行, ... [详细]
  • ! Configuration File for keepalivedglobal_defs {   notification_email {     ... [详细]
  • OSI七层模型、TCP/IP五层模型
    OSI网络互连的七层框架:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层;应用层OSI参考模型中最靠近用户的一层,是为计算机用户提供应用接口,为用户直接提供各种网 ... [详细]
author-avatar
许先生不会再想过去的事观_307
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有