22 网络编程
Ŀ¼
22 网络编程
22.1 网络概述
22.1.1 网络协议
- 第一次,传输文件名,接收方接收到文件名,应答OK给发送方;
- 第二次,发送文件的尺寸,接收方接收到该数据再次应答一个OK;
- 第三次,传输文件内容。同样,接收方接收数据完成后应答OK表示文件内容接收成功。
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.层与协议
- 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)链路层
2)网络层
3)传输层
- 对于同一个端口,在不同系统中对应着不同的进程
- 对于同一个系统,一个端口只能被一个进程拥有
4)应用层
网络通信条件:
3)端口
22.2 Socket编程
22.2.1 什么是Socket
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作为客户端