Golang——22_网络编程 - Go语言中文社区

Golang——22_网络编程


22 网络编程

目录

22 网络编程

    22.1 网络概述

        22.1.1 网络协议

        22.1.2 分层模型

            1.网络分层架构

            2.层与协议

            3.每层协议的功能

                1)链路层

                2)网络层

                3)传输层

                4)应用层

    22.2 Socket编程

        22.2.1 什么是Socket

        22.2.2 TCP的C/S架构

        22.2.3 示例程序

            1.服务器代码

            2.客户端代码

            3.运行结果

    22.3 HTTP编程

        22.3.1 概述

            1.Web工作方式

            2.HTTP协议

            3.地址(URL)

        22.3.2 HTTP报文浅析

            1.请求报文格式

                1)测试代码

                2)请求报文格式说明

                


22.1 网络概述


22.1.1 网络协议

        从应用的角度出发,协议可理解为“规则”,是数据传输和数据的解释规则。

        假设,A、B双方欲传输文件。规定:

  • 第一次,传输文件名,接收方接收到文件名,应答OK给发送方;
  • 第二次,发送文件的尺寸,接收方接收到该数据再次应答一个OK;
  • 第三次,传输文件内容。同样,接收方接收数据完成后应答OK表示文件内容接收成功。

        由此,无论A、B之间传递何种文件,都是通过三次数据传输来完成。A、B之间形成了一个最简单的数据传输规则。双方都按此规则发送、接收数据。A、B之间达成的这个相互遵守的规则即为协议。

        这种仅在A、B之间被遵守的协议称之为原始协议。

        当此协议被更多的人采用,不断的增加、改进、维护、完善,最终形成一个稳定的、完整的文件传输协议,被广泛应用于各种文件传输过程中。该协议就成为一个标准协议。最早的ftp协议就是由此衍生而来。

22.1.2 分层模型

1.网络分层架构

        为了减少协议设计的复杂性,大多数网络模型均采用分层的方式来组织。每一层都有自己的功能,就像建筑物一样,每一层都靠下一层支持。每一层利用下一层提供的服务来为上一层提供服务,本层服务的实现细节对上层屏蔽。


        越下面的层,越靠近硬件;越上面的层,越靠近用户。至于每一层叫什么名字,其实并不重要(面试的时候,面试官可能会问每一层的名字)。只需要知道,互联网分成若干层即可。

1)物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后再转化为1、0,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特。

2)数据链路层:定义了如何让格式化数据以帧为单位进行传输,以及如何控制对物理介质的访问。这一层通常还提供错误检测和纠正,以确保数据的可靠传输。如:串口通信中使用到的115200、8、N、1。

3)网络层:在位于不同地理位置的网络中的两个主机系统之间提供链接和路径选择。Internet的发展使得从世界各站点访问信息的用户数大大增加,而网络层正是管理这种链接的层。

4)传输层:定义了一些传输数据的协议和端口号(WWW端口80等),如:TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据),UDP(用户数据报协议,与TCP特性恰恰相反,用于传输可靠性要求不高,数据量小的数据,如QQ聊天数据就是通过这种方式传输的)。主要是将从下层接收的数据进行分段和传输,到达目的地址后再进行重组。常常把这一层数据叫做段。

5)会话层:通过传输层(端口号:传输端口与接收端口)建立数据传输的通路。主要在你的系统之间发起会话或者接收会话请求(设备之间需要互相认识可以是IP也可以是MAC或者是主机名)。

6)表示层:可确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取。例如,PC程序与另一台计算机进行通信,其中一台计算机使用扩展二一十进制交换码(EBCDIC),而另一台则使用美国信息交换标准码(ASCII)来表示相同的字符。如有必要,表示层会通过使用一种通用格式来实现多种数据格式之间的转换。

7)应用层:是最靠近用户的OSI层。这一层为用户的应用程序(例如电子邮件、文件传输和终端仿真)提供网络服务。


2.层与协议

        每一层都是为了完成一种功能,为了实现这些功能,就需要大家都遵守共同的规则。大家都遵守这规则,就叫做“协议”(protocol)。

        网络的每一层,都定义了很多协议。这些协议的总称,叫“TCP/IP协议”。TCP/IP协议是一个大家族,不仅仅只有TCP和IP协议,它还包括其它的协议,如下图:


  • ARP:是正向地址解析协议(Address Resolution Protocol),通过已知的IP,寻找对应主机的MAC地址。
  • RARP:是反向地址转换协议,通过MAC地址确定IP地址。
  • IP:是因特网互联协议(Internet Protocol)。
  • ICMP:是Internet控制报文协议(Internet Control Message Protocol),它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。
  • IGMP:是Internet组管理协议(Internet Group Management Protocol),是因特网协议家族中的一个组播协议。该协议运行在主机和组播路由器之间。(QQ群)
  • TCP:传输控制协议(Transmission Control Protocol),是一种面向连接的、可靠的、基于字节流的传输层通信协议。
  • UDP:用户数据报协议(User Datagram Protocol),是OSI参考模型中一种无连接的传输层协议,提供面向事物的简单不可靠信息传送服务。
  • HTTP:超文本传输协议(Hyper Text Transfer Protocol),是互联网上应用最为广泛的一种网络协议。
  • FTP:文件传输协议(File Transfer Protocol)。(下电影时会用)

(Telnet,远程连接他人电脑;)


3.每层协议的功能


1)链路层

        以太网规定,连入网络的所有设备,都必须具有“网卡”接口。数据包必须是从一块网卡,传送到另一块网卡。通过网卡能够能使不同的计算机之间连接,从而完成数据通信等功能。网卡的地址——MAC地址,就是数据包的物理发送地址和物理接收地址。

2)网络层

        网络层的作用是引用一套新的地址,使得我们能够区分不同的计算机是否属于同一个子网络。这套地址就叫做“网络地址”,这是我们平时所说的IP地址。这个IP地址好比我们的手机号码,通过手机号码可以得到用户所在的归属地。

        网络地址帮助我们确定计算机所在的子网络,MAC地址则将数据包送到该子网络中的目标网卡。网络层协议包含的主要信息是源IP和目的IP。

        于是,“网络层”出现以后,每台计算机有了两种地址,一种是MAC地址,另一种是网络地址。两种地址之间没有任何联系,MAC地址是绑定在网卡上的,网络地址则是管理员分配的,它们只是随机组合在一起。

        网络地址帮助我们确定计算机所在的子网络,MAC地址则将数据包送到该子网络中的目标网卡。因此,从逻辑上可以推断,必定是先处理网络地址,然后再处理MAC地址。

3)传输层

        当我们一边聊QQ,一边聊微信,当一个数据包从互联网上发来的时候,我们怎么知道它是来自QQ的内容?还是来自微信的内容?

        也就是说,我们还需要一个参数,表示这个数据包到底供哪个程序(进程)使用。这个参数就叫做“端口”(port),它其实是每一个使用网卡的程序的编号。每个数据包都发送到主机的特定端口,所以不同的程序就能取到自己所需的数据。

        端口特点:

  • 对于同一个端口,在不同系统中对应着不同的进程
  • 对于同一个系统,一个端口只能被一个进程拥有

4)应用层

        应用程序收到“传输层”的数据,接下来就要进行解读。由于互联网是开放架构,数据来源五花八门,必须事先规定好格式,否则根本无法解读。“应用层”的作用,就是规定应用程序的数据格式。


网络通信条件:

1)网卡,mac地址(不需要用户处理)    ARP——>通过ip找mac

2)逻辑地址,ip地址(需要用户指定)           ——>为了确定哪个电脑接收

3)端口

    a)同一系统,一个程序只能绑定一个端口

    b)不同系统,同一端口对应的程序可能不一样




22.2 Socket编程


22.2.1 什么是Socket

        Socket(套接字)起源于Unix,而Unix基本哲学之一就是“一切皆文件”,都可以用“打开open ->读写write/read -> 关闭close”模式来操作。Socket就是该模式的一个实现,网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用:Socket(),该函数返回一个整形的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。

        常用Socket类型有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCKET_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。

go语言已经做好了:



22.2.2 TCP的C/S架构


        CS模型:客户端(Client)和服务器(Server)

客户端——>客户

1)主动请求服务


服务器——>客服

2)被动提供服务


        BS模型:浏览器(Browser)和服务器(Server)

浏览器——>客户端,html


22.2.3 示例程序


1.服务器代码

package main

import (
	"fmt"
	"net"
)

func main() {
	//监听
	listener, err := net.Listen("tcp", "127.0.0.1:8000")
	if err != nil {
		fmt.Println("err = ", err)
		return
	}

	defer listener.Close() //别忘了关闭

	//阻塞等待用户链接
	conn, err := listener.Accept()
	if err != nil {
		fmt.Println("err = ", err)
		return
	}

	//关闭当前用户链接
	defer conn.Close()

	//接收用户的请求
	buf := make([]byte, 1024) //1024大小的缓冲区
	n, err1 := conn.Read(buf)
	if err1 != nil {
		fmt.Println("err1 = ", err1)
		return
	}

	fmt.Println("buf = ", string(buf[:n]))
}

        成功连接一次并发送一次消息,程序就结束了。


2.客户端代码

一、使用netcat作为客户端

        1)下载地址为:https://eternallybored.org/misc/netcat/

        2)下载后解压到netcat文件夹

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/u012869599/article/details/80461934
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2019-09-04 14:22:23
  • 阅读 ( 805 )
  • 分类:Go

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢