三次握手:
創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站建設(shè)、網(wǎng)站制作、杞縣網(wǎng)絡(luò)推廣、重慶小程序開發(fā)、杞縣網(wǎng)絡(luò)營銷、杞縣企業(yè)策劃、杞縣品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供杞縣建站搭建服務(wù),24小時服務(wù)熱線:18982081108,官方網(wǎng)址:www.cdcxhl.com
1. 主動發(fā)起連接請求端(客戶端),發(fā)送 SYN 標志位,攜帶數(shù)據(jù)包、包號
2. 被動接收連接請求端(服務(wù)器),接收 SYN,回復(fù) ACK,攜帶應(yīng)答序列號。同時,發(fā)送SYN標志位,攜帶數(shù)據(jù)包、包號
3. 主動發(fā)起連接請求端(客戶端),接收SYN 標志位,回復(fù) ACK。
被動端(服務(wù)器)接收 ACK —— 標志著 三次握手建立完成( Accept()/Dial() 返回 )
四次揮手:
1. 主動請求斷開連接端(客戶端), 發(fā)送 FIN標志,攜帶數(shù)據(jù)包
2. 被動接受斷開連接端(服務(wù)器), 發(fā)送 ACK標志,攜帶應(yīng)答序列號。 —— 半關(guān)閉完成。
3. 被動接受斷開連接端(服務(wù)器), 發(fā)送 FIN標志,攜帶數(shù)據(jù)包
4. 主動請求斷開連接端(客戶端), 發(fā)送 最后一個 ACK標志,攜帶應(yīng)答序列號?!?發(fā)送完成,客戶端不會直接退出,等 2MSL時長。
等 2MSL待目的:確保服務(wù)器 收到最后一個ACK
滑動窗口:
通知對端本地存儲數(shù)據(jù)的 緩沖區(qū)容量?!?write 函數(shù)在對端 緩沖區(qū)滿時,有可能阻塞。
TCP狀態(tài)轉(zhuǎn)換:
1. 主動發(fā)起連接請求端:
CLOSED —— 發(fā)送SYN —— SYN_SENT(了解) —— 接收ACK、SYN,回發(fā) ACK —— ESTABLISHED (數(shù)據(jù)通信)
2. 主動關(guān)閉連接請求端:
ESTABLISHED —— 發(fā)送FIN —— FIN_WAIT_1 —— 接收ACK —— FIN_WAIT_2 (半關(guān)閉、主動端)
—— 接收FIN、回復(fù)ACK —— TIME_WAIT (主動端) —— 等 2MSL 時長 —— CLOSED
3. 被動建立連接請求端:
CLOSED —— LISTEN —— 接收SYN、發(fā)送ACK、SYN —— SYN_RCVD —— 接收 ACK —— ESTABLISHED (數(shù)據(jù)通信)
4. 被動斷開連接請求端:
ESTABLISHED —— 接收 FIN、發(fā)送 ACK —— CLOSE_WAIT —— 發(fā)送 FIN —— LAST_ACK —— 接收ACK —— CLOSED
windows下查看TCP狀態(tài)轉(zhuǎn)換:
netstat -an | findstr? 端口號
Linux下查看TCP狀態(tài)轉(zhuǎn)換:
netstat -an | grep? 端口號
TCP和UDP對比:?
TCP: 面向連接的可靠的數(shù)據(jù)包傳遞。 針對不穩(wěn)定的 網(wǎng)絡(luò)層,完全彌補。ACK
UDP:無連接不可靠的報文傳輸。 針對不穩(wěn)定的 網(wǎng)絡(luò)層,完全不彌補。還原網(wǎng)絡(luò)真實狀態(tài)。
優(yōu)點???????????????????????????????????????????????????????????? 缺點
TCP: 可靠、順序、穩(wěn)定 ???????????????????????????????????? 系統(tǒng)資源消耗大,程序?qū)崿F(xiàn)繁復(fù)、速度慢
UDP:系統(tǒng)資源消耗小,程序?qū)崿F(xiàn)簡單、速度快 ???????????????????????? 不可靠、無序、不穩(wěn)定
使用場景:
TCP:大文件、可靠數(shù)據(jù)傳輸。 對數(shù)據(jù)的 穩(wěn)定性、準確性、一致性要求較高的場合。
UDP:應(yīng)用于對數(shù)據(jù)時效性要求較高的場合。 網(wǎng)絡(luò)直播、電話會議、視頻直播、網(wǎng)絡(luò)游戲。
UDP-CS-Server實現(xiàn)流程:
1.? 創(chuàng)建 udp地址結(jié)構(gòu) ResolveUDPAddr(“協(xié)議”, “IP:port”) —— udpAddr 本質(zhì) struct{IP、port}
2.? 創(chuàng)建用于 數(shù)據(jù)通信的 socket ListenUDP(“協(xié)議”, udpAddr ) —— udpConn (socket)
3.? 從客戶端讀取數(shù)據(jù),獲取對端的地址 udpConn.ReadFromUDP() —— 返回:n,clientAddr, err
4.? 發(fā)送數(shù)據(jù)包給 客戶端 udpConn.WriteToUDP("數(shù)據(jù)", clientAddr)
UDP-CS-Client實現(xiàn)流程:
1.? 創(chuàng)建用于通信的 socket。 net.Dial("udp", "服務(wù)器IP:port") —— udpConn (socket)
2.? 以后流程參見 TCP客戶端實現(xiàn)源碼。
UDPserver默認就支持并發(fā)!
------------------------------------
命令行參數(shù): 在main函數(shù)啟動時,向整個程序傳參。 【重點】
語法: go run xxx.go ? argv1 argv2? argv3? argv4 。。。
xxx.exe:? 第 0 個參數(shù)。
argv1 :第 1 個參數(shù)。
argv2 :第 2 個參數(shù)。
argv3 :第 3 個參數(shù)。
argv4 :第 4 個參數(shù)。
使用: list := os.Args? 提取所有命令行參數(shù)。
獲取文件屬性函數(shù):
os.stat(文件訪問絕對路徑) —— fileInfo 接口
fileInfo 包含 兩個接口。
Name() 獲取文件名。 不帶訪問路徑
Size() 獲取文件大小。
網(wǎng)絡(luò)文件傳輸 —— 發(fā)送端(客戶端)
1.? 獲取命令行參數(shù),得到文件名(帶路徑)filePath list := os.Args
2.? 使用 os.stat() 獲取 文件名(不帶路徑)fileName
3.? 創(chuàng)建 用于數(shù)據(jù)傳輸?shù)?socket? net.Dial("tcp", “服務(wù)器IP+port”) —— conn
4.? 發(fā)送文件名(不帶路徑)? 給接收端, conn.write()
5.? 讀取 接收端回發(fā)“ok”,判斷無誤。封裝函數(shù) sendFile(filePath, conn) 發(fā)送文件內(nèi)容
6.? 實現(xiàn) sendFile(filePath,? conn)
1) 只讀打開文件 os.Open(filePath)
for {
2) 從文件中讀數(shù)據(jù)? f.Read(buf)
3) 將讀到的數(shù)據(jù)寫到socket中? conn.write(buf[:n])
4)判斷讀取文件的 結(jié)尾。 io.EOF. 跳出循環(huán)
}
網(wǎng)絡(luò)文件傳輸 —— 接收端(服務(wù)器)
1. 創(chuàng)建用于監(jiān)聽的 socket net.Listen() —— listener
2. 借助listener 創(chuàng)建用于 通信的 socket listener.Accpet()? —— conn
3. 讀取 conn.read() 發(fā)送端的 文件名, 保存至本地。
4. 回發(fā) “ok”應(yīng)答 發(fā)送端。
5. 封裝函數(shù),接收文件內(nèi)容 recvFile(文件路徑)
1) f = os.Create(帶有路徑的文件名)
for {
2)從 socket中讀取發(fā)送端發(fā)送的 文件內(nèi)容 。 conn.read(buf)
3)? 將讀到的數(shù)據(jù) 保存至本地文件 f.Write(buf[:n])
4)? 判斷 讀取conn 結(jié)束, 代表文件傳輸完成。 n == 0? break
}
Get轉(zhuǎn)到定義是如下代碼,
func (c *Client) Get(url string) (resp *Response, err error) {
req, err := NewRequest("GET", url, nil)
if err != nil {
return nil, err
}
return c.Do(req)
}
看上去已經(jīng)有足夠多的動作了,并不是你說的只是一個接口啊
1、數(shù)據(jù)組裝:將圖層的數(shù)據(jù)和變量參數(shù)合成,得到該圖的圖層數(shù)據(jù)。
2、圖層生成:目前有三種圖層(后續(xù)會有更多種類),文字圖層:根據(jù)圖層數(shù)據(jù)(字體,字號,自重,顏色)生成文字圖層。圖片圖層:會對圖片進行本地緩存,如果已有緩存,則從緩存讀取,否則從網(wǎng)絡(luò)獲取。然后根據(jù)圖層數(shù)據(jù)(透明度,圓角)生成圖片圖層。二維碼圖層:使用二維碼生成工具,將url轉(zhuǎn)換成二維碼圖片圖層。
3、圖層合成:將圖片圖層和文字圖層按順序疊加,最后生成一張圖片返回。另外,利用Serverless部署Golang服務(wù),使用Serverless利用它自動擴縮容的優(yōu)點,提高服務(wù)性能,以及優(yōu)化成本。