TCP finished but have not reviewed yet

main
Your Name 2024-07-10 13:25:53 +08:00
parent 1e8a402121
commit 75794439e1
4 changed files with 118 additions and 0 deletions

View File

@ -0,0 +1,19 @@
物理层:
它主要规定了网络的一些电气特性作用是负责传送0和1的电信号。
数据链路层:
单纯的0和1没有任何意义所以我们使用者会为其赋予一些特定的含义规定解读电信号的方式
一组电信号构成一个数据包,叫做"帧"Frame。每一帧分成两个部分标头Head和数据Data
其中"标头"包含数据包的一些说明项,比如发送者、接受者、数据类型等等;“数据"则是数据包的具体内容。
以太网规定,连入网络的所有设备都必须具有"网卡"接口。数据包必须是从一块网卡传送到另一块网卡。网卡的地址就是数据包的发送地址和接收地址这叫做MAC地址。
每块网卡出厂的时候都有一个全世界独一无二的MAC地址长度是48个二进制位通常用12个十六进制数表示。
前6个十六进制数是厂商编号后6个是该厂商的网卡流水号。有了MAC地址就可以定位网卡和数据包的路径了。
网络层:
必须找到一种方法区分哪些MAC地址属于同一个子网络哪些不是。如果是同一个子网络就采用广播方式发送否则就采用"路由"方式发送。这就导致了"网络层"的诞生。
它的作用是引进一套新的地址,使得我们能够区分不同的计算机是否属于同一个子网络。这套地址就叫做"网络地址",简称"网址"。
规定网络地址的协议叫做IP协议。它所定义的地址就被称为IP地址。目前广泛采用的是IP协议第四版简称IPv4。
IPv4这个版本规定网络地址由32个二进制位组成我们通常习惯用分成四段的十进制数表示IP地址从0.0.0.0一直到255.255.255.255。
传输层:
我们如何区分某个数据包到底是归哪个程序的呢?
也就是说,我们还需要一个参数,表示这个数据包到底供哪个程序(进程)使用。这个参数就叫做"端口”port它其实是每一个使用网卡的程序的编号。
每个数据包都发到主机的特定端口,所以不同的程序就能取到自己所需要的数据。
“端口"是0到65535之间的一个整数正好16个二进制位。0到1023的端口被系统占用用户只能选用大于1023的端口。有了IP和端口我们就能实现唯一确定互联网上一个程序进而实现网络间的程序通信。

View File

@ -0,0 +1,42 @@
package main
import (
"bufio"
"fmt"
"log"
"net"
"os"
"strings"
)
//TCP client端
func main() {
//1.与server端建立链接
conn, err := net.Dial("tcp", "127.0.0.1:20000")
if err != nil {
log.Fatal("dial server failed on:", err)
}
defer conn.Close()
//2.发送数据
reader := bufio.NewReader(os.Stdin)
buf := make([]byte, 1024)
for {
fmt.Print("请发送信息:")
msg, _ := reader.ReadString('\n')
msg = strings.TrimSpace(msg)
if msg == "exit" {
break
}
conn.Write([]byte(msg))
fmt.Println("等待回复中..")
n, err := conn.Read(buf)
if err != nil {
log.Fatal("读取信息失败", err)
}
fmt.Println(string(buf[:n]))
}
}

View File

@ -0,0 +1,52 @@
package main
import (
"bufio"
"fmt"
"log"
"net"
"os"
"strings"
)
//TCP server端
func process(conn net.Conn) {
var tmp = make([]byte, 1024)
reader := bufio.NewReader(os.Stdin)
for {
n, err := conn.Read(tmp[:])
if err != nil {
log.Fatal("read failed on:", err)
return
}
fmt.Println(string(tmp[:n]))
fmt.Print("请回复:")
msg, _ := reader.ReadString('\n')
msg = strings.TrimSpace(msg)
if msg == "exit" {
break
}
conn.Write([]byte(msg))
fmt.Println("等待回复中..")
}
}
func main() {
//1.本地端口启动服务
listener, err := net.Listen("tcp", "127.0.0.1:20000")
if err != nil {
log.Fatal("start Tcp server failed on:", err)
return
}
//2.等待别人来跟我建立链接
for {
conn, err := listener.Accept()
if err != nil {
log.Fatal("accept failed on:", err)
}
//3与客户端通信
go process(conn)
}
}

5
sync/atomic.go Normal file
View File

@ -0,0 +1,5 @@
package main
func main() {
}