PUSH指令主要用于編寫子程序和中斷服務程序,可以臨時保存程序狀態(tài)字PSW和累加器ACC的內(nèi)容 或其它寄存器和存儲器單元的內(nèi)容。
目前創(chuàng)新互聯(lián)建站已為上千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、雅安服務器托管、網(wǎng)站托管維護、企業(yè)網(wǎng)站設(shè)計、集安網(wǎng)站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
在子程序和中斷服務程序結(jié)束返回主程序前,要用POP彈棧指令,從堆棧中取出被保護的數(shù)據(jù),恢復程序狀態(tài)字PSW和累加器ACC的內(nèi)容 或其它寄存器和存儲器單元的內(nèi)容。
呵呵 滿意 就選滿意回答啊
有個通過代理進來的tcp連接,通過Conn.RemoteAddr獲取到的是代理點的ip地址,為了獲取實際客戶端的ip,找到了syscall.Getpeername的方法,而這個方法需要的是連接的fd。
三次握手:
1. 主動發(fā)起連接請求端(客戶端),發(fā)送 SYN 標志位,攜帶數(shù)據(jù)包、包號
2. 被動接收連接請求端(服務器),接收 SYN,回復 ACK,攜帶應答序列號。同時,發(fā)送SYN標志位,攜帶數(shù)據(jù)包、包號
3. 主動發(fā)起連接請求端(客戶端),接收SYN 標志位,回復 ACK。
被動端(服務器)接收 ACK —— 標志著 三次握手建立完成( Accept()/Dial() 返回 )
四次揮手:
1. 主動請求斷開連接端(客戶端), 發(fā)送 FIN標志,攜帶數(shù)據(jù)包
2. 被動接受斷開連接端(服務器), 發(fā)送 ACK標志,攜帶應答序列號。 —— 半關(guān)閉完成。
3. 被動接受斷開連接端(服務器), 發(fā)送 FIN標志,攜帶數(shù)據(jù)包
4. 主動請求斷開連接端(客戶端), 發(fā)送 最后一個 ACK標志,攜帶應答序列號?!?發(fā)送完成,客戶端不會直接退出,等 2MSL時長。
等 2MSL待目的:確保服務器 收到最后一個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、回復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)繁復、速度慢
UDP:系統(tǒng)資源消耗小,程序?qū)崿F(xiàn)簡單、速度快 ???????????????????????? 不可靠、無序、不穩(wěn)定
使用場景:
TCP:大文件、可靠數(shù)據(jù)傳輸。 對數(shù)據(jù)的 穩(wěn)定性、準確性、一致性要求較高的場合。
UDP:應用于對數(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", "服務器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", “服務器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ò)文件傳輸 —— 接收端(服務器)
1. 創(chuàng)建用于監(jiān)聽的 socket net.Listen() —— listener
2. 借助listener 創(chuàng)建用于 通信的 socket listener.Accpet()? —— conn
3. 讀取 conn.read() 發(fā)送端的 文件名, 保存至本地。
4. 回發(fā) “ok”應答 發(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
}
首先,看一下TCP握手簡單描繪過程:
其握手過程原理,就不必說了,有很多詳細文章進行敘述,本文只關(guān)注研究重點。
在第三次握手過程中,如果服務器收到ACK,就會與客戶端建立連接,此時內(nèi)核會把連接從半連接隊列移除,然后創(chuàng)建新的連接,并將其添加到全連接隊列,等待進程調(diào)用。
如果服務器繁忙,來不及調(diào)用連接導致全連接隊列溢出,服務器就會放棄當前握手連接,發(fā)送RST給客戶端,即connection reset by peer。
在linux平臺上,客戶端在進行高并發(fā)TCP連接處理時,最高并發(fā)數(shù)量都要受系統(tǒng)對用戶單一進程同時打開文件數(shù)量的限制(這是因為系統(tǒng)每個TCP都是SOCKET句柄,每個soker句柄都是一個文件),當打開連接超過限制,就會出現(xiàn)too many open files。
使用下指令查看最大句柄數(shù)量:
增加句柄解決方案