维基百科上的一些解释

先列下代码

package main

import (
	"golang.org/x/net/websocket"
	"fmt"
	"net/http"
)

func main() {
	fmt.Println("服务器启动聊天")
	http.Handle("/",websocket.Handler(Server))
	http.ListenAndServe(":8001", nil)
}

func Server(ws *websocket.Conn) {
	var err error

	for {
		fmt.Println("Somethings")
		var reply string
		if err = websocket.Message.Receive(ws, &reply); err != nil {
			fmt.Println("服务器接收错误")
			break
		}

		fmt.Println("接收客户端的信息: " + reply)

		if err = websocket.Message.Send(ws, "hf:"+ reply); err != nil {
			fmt.Println("服务器发送错误")
			break
		}

	}
}
package main

import (
	"golang.org/x/net/websocket"
	"fmt"
)

func main() {
	fmt.Println("客户端启动聊天")
	ws,_ := websocket.Dial("ws://localhost:8001/", "", "http://localhost")
	//xx := 1
	for {
		//if xx<2 {
			ws.Write([]byte("hi\n"))
			msg := make([]byte, 512)
			ws.Read(msg)
			fmt.Println(msg[:4])
		//}
		//xx++

	}

}

三次握手


过滤以后的截图

tcp三次握手


第一次握手

客户端发送一个SYN(0x002)及序号Sequence number(x)为0 tcp1


第二次握手

服务器发送一个SYN+ACK(0x012)和序号Sequence number(y)为0及确认序号Ackonwledgment number(x+1)为1 tcp2


第三次握手

客户端再发送一个ACK(0x010)和序号Sequence number(z)为1及确认序号Ackonwledgment number(y+1)为1 tcp3


握手过程的请求头不知道在wireshark里怎么看,直接在chrome里看了

客户端发送请求:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: 87S17l8VkNLX49cU37Rihu07/OQ=

服务器返回:

Cache-Control:no-cache
Connection:Upgrade
Host:127.0.0.1:8001
Origin:http://www.websocket.org
Pragma:no-cache
Sec-WebSocket-Extensions:permessage-deflate; client_max_window_bits
Sec-WebSocket-Key:2WD941F+9UY1g7pGHXA2eg==
Sec-WebSocket-Version:13
Upgrade:websocket

以此类似的过程完成三次握手

客户端和服务器只需要做一个握手的动作,然后,客户端和服务器之间就形成了全双工的状态下相互通信。在断开连接时也有一次握手

数据传输

直接上图(涉及到相关数据帧的处理)

wbtext