惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Security Archives - TechRepublic
MongoDB | Blog
MongoDB | Blog
量子位
博客园 - 叶小钗
罗磊的独立博客
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Hacker News: Ask HN
Hacker News: Ask HN
MyScale Blog
MyScale Blog
GbyAI
GbyAI
Help Net Security
Help Net Security
Y
Y Combinator Blog
Engineering at Meta
Engineering at Meta
Hacker News - Newest:
Hacker News - Newest: "LLM"
Latest news
Latest news
H
Hacker News: Front Page
Blog — PlanetScale
Blog — PlanetScale
雷峰网
雷峰网
Microsoft Azure Blog
Microsoft Azure Blog
P
Proofpoint News Feed
C
CXSECURITY Database RSS Feed - CXSecurity.com
Scott Helme
Scott Helme
S
Schneier on Security
博客园 - 司徒正美
Hugging Face - Blog
Hugging Face - Blog
S
Security @ Cisco Blogs
Recorded Future
Recorded Future
S
Securelist
博客园 - Franky
Application and Cybersecurity Blog
Application and Cybersecurity Blog
A
About on SuperTechFans
N
News and Events Feed by Topic
AI
AI
T
Tenable Blog
N
News | PayPal Newsroom
C
Cybersecurity and Infrastructure Security Agency CISA
V
V2EX - 技术
T
Threat Research - Cisco Blogs
Cisco Talos Blog
Cisco Talos Blog
L
LINUX DO - 热门话题
N
Netflix TechBlog - Medium
S
SegmentFault 最新的问题
T
The Blog of Author Tim Ferriss
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Google Online Security Blog
Google Online Security Blog
S
Security Affairs
Webroot Blog
Webroot Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
博客园 - 三生石上(FineUI控件)
C
Comments on: Blog
G
GRAHAM CLULEY

博客园 - 网鱼

Twitter的分布式自增ID雪花算法snowflake (Java版) 雪花算法:生成分布式全局唯一ID 数据加密共享与签名方案 Java 8中处理集合的优雅姿势——Stream 消息中间件选型分析——从Kafka与RabbitMQ的对比来看全局 从概念到底层技术,一文看懂区块链架构设计(附知识图谱) 以太坊源码分析——BlockChain 超级账本实践——基于docker从零搭建联盟链 Hyperledger Fabric V1.0– 开发者快速入门 超级账本Fabric教程(一):超级账本入门 区块链技术基础语言(三十一):Go语言网络编程(上) 区块链技术基础语言(三十):Go语言常用工具包(下) 区块链技术语言(二十九)—Go语言常用工具包(上) 区块链技术语言(二十八)——Go语言并发编程(下) 区块链技术语言(二十七)——Go语言并发编程(上) 区块链技术语言(二十六)——Go语言异常处理 区块链技术语言(二十五)——面向对象:接口 区块链技术语言(二十四)——Go语言面向对象:匿名组合 区块链技术语言(二十三)——Go语言面向对象:方法
区块链技术基础语言(三十二):Go语言网络编程(下)
网鱼 · 2019-03-07 · via 博客园 - 网鱼

本文紧接上文所述,讲解socket编程和HTTP编程。

一、socket编程

在上一节我们介绍了网络体系的五层模型,介绍了每层模型所遵守的协议。TCP/IP是一个协议族,它由网络层的IP协议和传输层的TCP协议组成,其中网络层建立了主机到主机的通信,传输层建立了端口到端口的通信。只要确定主机和端口,就能实现程序之间的交流。因此,Unix系统把主机+端口,叫作“套接字(socket)”,而socket本质上是编程接口(API),它是对TCP/IP的封装。有了它,就可以进行网络应用程序的开发。

1.1 网络中进程之间的通信

网络中的每个进程都运行在独立的地址空间,为了保证两个相互通信的进程在互不干扰的前提下协调一致地工作,操作系统需要解决网间进程的标识问题。在网络概述中已经介绍过,ip地址可以唯一标识网络中的主机,而传输层的“协议+端口”可以唯一标识主机中的应用程序,也就是进程。因此网络中的进程通信可以通过“ip地址+协议+端口”与其它进程进行交互。而TCP/IP协议的应用程序通常采用应用编程接口:UNIX BSD的套接字(socket)。

1.2 socket套接字

Socket本质上是编程接口(API),它是对TCP/IP的封装,是应用层和其他层(传输层、网络层、数据链路层)之间的软件抽象层,它将传输层、网络层、数据链路层隐藏在socket接口后面。对用户来说,一组简单的接口就是全部,让socket去组织数据,以符合指定的协议,让编程变得更简单。

1.3 TCP的C/S架构

TCP的C/S架构主要分为客户端和服务器端。

服务器端先初始化socket,接着将socket与端口进行绑定(bind),然后对端口进行监听(listen),然后调用accept函数,等待客户端地请求连接。在这时如果有一个客户端初始化一个socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接(close),一次交互结束。

1.4 示例程序

1.4.1 简单服务器

设计一个服务器程序和客户端程序。启动服务器程序后,再启动客户端程序,客户端的程序连接到服务器程序后,客户端的信息内容会显示在服务器程序。

1.4.2 简单并发服务器

在1.4.1中启动服务器程序,再运行客户端程序,整个程序就会结束。现在服务器程序设计一个能同时处理多个客户端程序发送的内容。

二、HTTP编程

2.1 概述

2.1.1 Web工作方式

平时浏览某一网页,我们一般会打开浏览器,输入网址,回车后就可以浏览网址内容。这一简单的操作行为,系统是通过以下步骤实现的:

a. 浏览器是一个客户端,输入URL(统一资源定位符,即网址),浏览器通过请求DNS服务器获取相应的域名所对应的IP;

b. 通过IP地址找到IP对应的服务器,建立TCP连接;

c. 浏览器向服务器发送HTTP Request包,等服务器全部接收到请求包服务器才开始处理请求包,然后服务器向浏览器(客户端)返回HTTP Response(响应)包;

d. 客户端收到来自服务器的响应后开始渲染这个Response包里的主体(body),等收到全部的内容之后,就断开与该服务器之间的TCP连接。

2.1.2 HTTP服务器工作原理

Web服务器也被称为HTTP服务器,它通过HTTP协议与客户端通信。其工作原理即:

a. 客户机通过TCP/IP协议与服务器建立TCP连接;

b. 客户端向服务器发送HTTP协议请求包,请求服务器里的资源文档;

c. 服务器向客户机发送HTTP协议应答包,如果请求的资源包含有动态语言的内容,那么服务器会调用动态语言的解释引擎负责处理“动态内容”,并将处理得到的数据返回给客户端;

d. 客户机与服务器断开。由客户端解释HTML文档,在客户端屏幕上渲染图形结果。

2.1.3 HTTP协议

HTTP协议(HyperText Transfer Protocol,超文本传输协议),是应用层的协议,如表1所示。它是互联网应用中最为广泛的一种网络协议,详细规定了浏览器和万维网服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。

2.2 HTTP 请求和应答

2.2.1 客户端向服务器请求包

建立一个HTTP服务器,在客户端(浏览器)输入URL,向HTTP服务器发送请求包。

2.2.2 服务器向客户端发出的应答包

建立一个HTTP服务器和客户端,客户端连接HTTP服务器,服务器向客户端发送应答包。

参考资料

[1] https://studygolang.com/pkgdoc

[2] https://blog.csdn.net/qq_33530388/article/details/65935217