客户端服务器

TCP协议的客户端与服务器的通信过程

廉价感情. 提交于 2020-01-27 22:52:20
使用TCP时,客户端与服务器端的通信流程 服务器初始化 1)调用socket,创建文件描述符fd 2) 调用bind将fd与服务器的IP与PORT绑定 3)调用listen将套接字设为监听模式,准备接收客户端连接请求 4)调用accept等待并接收客户端的连接请求,建立好TCP连接后,该函数会返回一个新的已连接套接字newfd 建立连接 1)客户端调用socket创建文件描述符 2)调用connect,向服务器发送连接请求 3)connect会发送一个请求SYN段并阻塞等待服务器应答(第一次握手) 4)服务器收到SYN,会给客户端发送一个确认应答ACK,同时发送一个请求(SYN)建立连接(第二次握手) 5)客户端收到服务器发的SYN+ACK段,表明客户端连接已建立成功,进入已连接状态。客户端再向服务器 发送一个ACK段,服务器收到后则服务器连接成功。 数据传输 1)连接建立成功后,在同一连接、同一时刻,通信双方可同时写数据(全双工) 2)服务器端从accept()返回后调用read()开始读数据,若没有数据则阻塞等待 3)客户端调用write()向服务器发送数据请求,客户端收到之后调用read()处理请求,此过程服务器调用read()阻塞等待 4)服务器调用write()将处理好的请求发送给客户端,再次调用read()等待下一个请求 5)客户端收到后从read()返回

TCP协议的三次握手和四次挥手

不想你离开。 提交于 2020-01-27 05:12:09
三次握手: 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。 完成三次握手,客户端与服务器开始传送数据。 四次挥手: 客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送 服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1 服务器B关闭与客户端A的连接,发送一个FIN给客户端A 客户端A发回ACK报文确认,并将确认序号设置为收到序号加1 为什么三次握手,却是四次挥手呢?   这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了

Netty序章之BIO NIO AIO演变

扶醉桌前 提交于 2020-01-26 08:31:57
netty是什么     Netty是一个基于Java NIO的client-server网络服务框架,人们可以利用netty快速地开发网络应用。同时netty相对于其他网络框架更加简单并且扩展性更强,这主要得益于其提供的简单易用的api将业务逻辑和网络处理代码解耦开来。能够使你更加专注于业务的实现而不需要太多关心网络底层实现。 Netty是一个提供异步事件驱动的网络应用框架,用以快速开发 高性能 、 高可靠 的网络服务器和客户端程序。Netty简化了网络程序的开发,是很多框架和公司都在使用的技术。更是面试的加分项。Netty并非横空出世,它是在BIO,NIO,AIO演变中的产物,是一种NIO框架。而BIO,NIO,AIO更是笔试中要考,面试中要问的技术。也是一个很好的加分项 流程图: 技术:BIO,NIO,AIO 说明:github上有更全的源码。 源码: https://github.com/ITDragonBl... BIO BIO 全称Block-IO 是一种 阻塞同步 的通信模式。我们常说的Stock IO 一般指的是BIO。是一个比较传统的通信方式, 模式简单 , 使用方便 。但 并发处理能力低 , 通信耗时 , 依赖网速 。 BIO 设计原理: 服务器通过一个Acceptor线程负责监听客户端请求和为每个客户端创建一个新的线程进行链路处理。典型的一请求一应答模式

Python网络编程

只谈情不闲聊 提交于 2020-01-26 01:49:50
简介 使用套接字进行网络编程。 网络编程 使用 socket 模块的 socket() 函数,可以创建套接字。 socket 模块函数 要创建套接字,必须使用 socket.socket() 函数,语法如下: socket(socket_family, socket_type, protocol=0) 其中, socket_family 是 AF_UNIX 或 AF_INET , socket_type 是 SOCK_STREAM 或 SOCK_DGRAM 。 protocol 通常省略,默认为 0 。 导入模块 创建 TCP/IP 套接字 tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 创建 UDP/IP 套接字 udpSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 套接字对象方法 服务器套接字方法 名称 描述 s.bind() 将地址(主机号、端口号对)绑定到套接字上 s.listen() 设置并启动 TCP 监听器 s.accept() 被动接受 TCP 客户端连接,一直等待知道连接到达(阻塞) 客户端套接字方法 名称 描述 s.connect() 主动发起 TCP 服务器连接 s.connect_ex() connect() 的扩展版本

b/s架构与c/s架构

别等时光非礼了梦想. 提交于 2020-01-26 00:59:28
1.什么是b/s架构?什么是c/s架构? B/S(Browser/Server),浏览器/服务器程序 应用系统完全放在应用服务器上, 并通过应用服务器同数据库服务器进行通信,系统界面 是通过浏览器来展现的. C/S(Client/Server),客户端/服务端,桌面应用程序! c/s架构分为客户端和服务器两层,用户在本地安装客户端软件,通过网络与服务器相互通信,最典型的应用有QQ聊天,微信,用户只需在客户端安装应用软件, 实现与服务器之间的通信. b/s原理: b/s采取浏览器请求,服务器响应的工作模式。 用户可以通过浏览器去访问 internet 上由web服务器产生的文本,数据等信息; 而每一个web服务器又可以通过各种方式与数据库服务器连接,大量的数据实际存放在数据库服务器中; 从web服务器上下载程序到本地来执行,在下载的过程中若遇到与数据库有关的指令,由web服务器交给数据库来解释执行,并返回给web服务器,web服务器又返回给用户,在这种结构中,将许许多多的网络连接在一起,形成全球网 c/s原理: c/s结构通常采取俩层结构。服务器负责数据的管理,客户机负责完成与用户的交互任务。 客户机通过局域网与服务器相连,接受用户的请求,并通过网络向服务器提出请求,对数据库进行操作。服务器接受客户机的请求,将数据提交给客户机,客户机将数据进行计算并将结果呈现给用户

长连接、短连接、长轮询和WebSocket

感情迁移 提交于 2020-01-25 22:28:57
//转发,格式待整理 2017-08-0519784View0 对这四个概念不太清楚,今天专门搜索了解一下,总结一下: 长连接:在HTTP 1.1,客户端发出请求,服务端接收请求,双方建立连接,在服务端没有返回之前保持连接,当客户端再发送请求时,它会使用同一个连接。这一直继续到客户端或服务器端认为会话已经结束,其中一方中断连接。 优势:减少了连接请求,降低TCP阻塞,减少了延迟,实时性较好。 劣势:可能会影响性能,因为它在文件被请求之后还保持了不必要的连接很长时间。 短连接:在HTTP1.0中,客户端发送请求,服务器接收请求,双方建立连接,服务器响应资源,请求结束。 长轮询:(我自己的理解)客户端不断发送请求,获取服务器上的数据。也有人说是长连接的一种,是这样吗??? WebSocket:客户端发送一次http websocket请求,服务器响应请求,双方建立持久连接,并进行双向数据传输,后面不进行HTTP连接,而是使用TCP连接。 什么是长连接、短连接? 在HTTP/1.0中默认使用短连接。也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个HTML或其他类型的web页中包含有其他的Web资源(如JavaScript文件、图像文件、CSS文件等),每遇到这样一个Web资源,浏览器就会重新建立一个HTTP会话。 而从HTTP

网络知识入门,探讨DNS服务器在网页请求中的作用(二)

北城以北 提交于 2020-01-25 19:56:45
上一篇文章讲到网络请求是基于http协议传输的,消息请求包含了“对什么”和“做什么操作”,于是一个网页请求就这么发送出去了。但是在发送消息之前,我们还需要对域名进行解析,得到ip地址之后才可以发送请求,本文就来探讨一下网页请求中如何将域解析为ip地址。 [网络知识入门,探索一次网页请求的旅程(一)] https://blog.csdn.net/ck784101777/article/details/103729743 一、向DNS服务器查询Web服务器的IP地址 生成HTTP消息之后,接下来我们需要委托操作系统将消息发送给Web服务器。尽管浏览器能够解析网址并生成HTTP消息,但它本身并不具备将消息发送到网络中的功能(浏览器本身也是借用本地操作系统来发送请求),因此这一功能需要委托操作系统来实现。在进行这一操作时,我们还有一个工作需要完成,那就是查询网址中服务器域名对应的IP地址。 在委托操作系统发送消息时,必须要提供的不是通信对象的域名,而是它的IP地址 。因此,在生成HTTP消息之后,下一个步骤就是根据域名查询IP地址。在讲解这一操作之前,让我们先来简单了解一下IP地址。 1.TCP/IP网络 互联网和公司内部的局域网都是基于TCP/IP的思路来设计的,所以我们先来了解TCP/IP的基本思路。TCP/IP的结构如图所示,就是由一些小的子网,通过路由器连接起来组成一个大的网络

在 Linux 下搭建 Git 服务器

陌路散爱 提交于 2020-01-25 17:49:35
在 Linux 下搭建 Git 服务器 环境: 服务器 Ubuntu12.04.5LTS + git(version 1.7.1)客户端 Windows10 + git(version 2.8.4.windows.1) ① 安装 Git Linux 做为服务器端系统,Windows 作为客户端系统,分别安装 Git 服务器端: #sudo apt-get install git-core #ps -ef|grep "sshd"                      //查看是否配置了ssh#sudo apt-get install openssh-server openssh-client 安装完后,查看 Git 版本 [root@localhost ~]# git --version git version 1.7.1 客户端: 下载 Git for Windows ,地址: https://git-for-windows.github.io/ 安装完之后,可以使用 Git Bash 作为命令行客户端。 安装完之后,查看 Git 版本 $ git --version git version 2.8.4.windows.1 ② 服务器端创建 git 用户,用来管理 Git 服务,并为 git 用户设置密码 [root@localhost home]# id git id:

Web框架本质

被刻印的时光 ゝ 提交于 2020-01-25 17:34:50
Web框架本质 1.本质   对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端。 2.原始版Web import socket sk = socket.socket() sk.bind(("127.0.0.1", 80)) sk.listen() while True: conn, addr = sk.accept() data = conn.recv(8096) conn.send(b"OK") conn.close()   我们在浏览器上输入:http://127.0.0.1/ 就可以看到服务端发来的"ok"了。可以说Web服务本质上都是在这十几行代码基础上扩展出来的。用户的浏览器一输入网址,会给服务端发送数据,那浏览器会发送什么数据?怎么发?这个谁来定? 这个规则就是HTTP协议,以后浏览器发送请求信息也好,服务器回复响应信息也罢,都要按照这个规则来。HTTP协议主要规定了客户端和服务器之间的通信格式,那HTTP协议是怎么规定消息格式的呢?让我们首先打印下我们在服务端接收到的消息是什么。    import socket sk = socket.socket() sk.bind(("127.0.0.1", 80)) sk.listen(5) while True: conn, addr = sk.accept() data

Session和Cookie实现购物车

限于喜欢 提交于 2020-01-25 13:39:48
来自森大科技官方博客 http://www.cnsendblog.com/index.php/?p=342 GPS平台、网站建设、软件开发、系统运维,找森大网络科技! http://cnsendnet.taobao.com 使用Session和Cookie实现购物车的比较   购物车相当于现实中超市的购物车,不同的是一个是实体车,一个是虚拟车而已。用户可以在购物网站的不同页面之间跳转,以选购自己喜爱的商品,点击购买时,该商品就自动保存到你的购物车中,重复选购后,最后将选中的所有商品放在购物车中统一到付款台结账,这也是尽量让客户体验到现实生活中购物的感觉。服务器通过追踪每个用户的行动,以保证在结账时每件商品都物有其主。 购物车的功能包括以下几项: 把商品添加到购物车,即订购 删除购物车中已定购的商品 修改购物车中某一本图书的订购数量 清空购物车 显示购物车中商品清单及数量、价格 实现购物车的关键在于服务器识别每一个用户并维持与他们的联系。但是HTTP协议是一种“无状态(Stateless)”的协议,因而服务器不能记住是谁在购买商品,当把商品加入购物车时,服务器也不知道购物车里原先有些什么,使得用户在不同页面间跳转时购物车无法“随身携带”,这都给购物车的实现造成了一定的困难。 目前购物车的实现主要是通过cookie、session或结合数据库的方式。下面分析一下它们的机制及作用。