一.OSI七層網絡模型
即開放式系統互連。 一般都叫OSI參考模型,是ISO組織在1985年研究的網絡互連模型。該體系結構標準定義了網絡互連的七層框架(物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層和應用層),即OSI開放系統互連參考模型。
應用層:HTML class,HTTP APIserver
表示層:CSS,GIF,XML,JSON
會話層:FTP,HTTP,HTTPS,SMTP,Telnet
傳輸層:TCP,UDP
網絡層:IPV4,IPV6,ICMP
數據鏈路層:IEEE802.2,MAC,ATM
物理層:RS-232
二.TCP 傳輸協議
TCP 協議:TCP是一個面向連接的,安全的,流式傳輸協議,這個協議是一個傳輸層協議。
面向連接:是一個雙向連接,通過三次握手完成,斷開連接需要通過四次揮手完成。
安全:tcp通信過程中,會對發送的每一數據包都會進行校驗, 如果發現數據丟失, 會自動重傳
流式傳輸:發送端和接收端處理數據的速度,數據的量都可以不一致
1.三次握手
第一次握手:客戶端向服務端發送連接請求包,標志位SYN(同步序號)置為1,順序號碼為X=0。
第二次握手:服務端收到客戶端發過來報文,由SYN=1知道客戶端要求建立聯機,則為這次連接分配資源。并向客戶端發送一個SYN和ACK都置為1的TCP報文,設置初始順序號碼Y=0,將確認序號(ack)設置為上一次客戶端發送過來的順序號(Seq)加1,即X+1 = 0+1=1。
第三次握手:客戶端收到服務端發來的包后檢查確認號碼(ack)是否正確,即第一次發送的Seq加1(X+1=1)。以及標志位ACK是否為1。若正確,服務端再次發送確認包,ACK標志位為1,SYN標志位為0。確認號碼(ack)=Y+1=0+1=1,發送順序號碼(Seq)為X+1=1。Server收到后確認號碼值與ACK=1則連接建立成功,可以傳送數據了。
2.四次揮手
為什么關閉的時候卻是四次揮手?
因為當Server端收到Client端的SYN連接請求報文后,可以直接發送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。但是關閉連接時,當Server端收到FIN報文時,很可能并不會立即關閉SOCKET,所以只能先回復一個ACK報文,告訴Client端,“你發的FIN報文我收到了”。只有等到我Server端所有的報文都發送完了,我才能發送FIN報文,因此不能一起發送。故需要四步握手。
第一次揮手:客戶端給服務端發送FIN報文,用來關閉客戶端到服務端的數據傳送。將標志位FIN和ACK置為1,順序號碼為X=1,確認號碼為Z=1。意思是說”我Client端沒有數據要發給你了,但是如果你還有數據沒有發送完成,則不必急著關閉Socket,可以繼續發送數據。所以你先發送ACK過來。”
第二次揮手:服務端收到FIN后,發回一個ACK(標志位ACK=1),確認號碼為收到的順序號碼加1,即X=X+1=2。順序號碼為收到的確認號碼=Z。意思是說“你的FIN請求我收到了,但是我還沒準備好,請繼續你等我的消息" 這個時候客戶端就進入FIN_WAIT狀態,繼續等待服務端的FIN報文。
第三次揮手:當服務端確定數據已發送完成,則向客戶端發送FIN報文,關閉與客戶端的連接。標志位FIN和ACK置為1,順序號碼為Y=1,確認號碼為X=2。意思是告訴Client端“好了,我這邊數據發完了,準備好關閉連接了。”
第四次揮手:客戶端收到服務器發送的FIN之后,發回ACK確認(標志位ACK=1),確認號碼為收到的順序號碼加1,即Y+1=2。順序號碼為收到的確認號碼X=2。意思是“我Client端知道可以關閉連接了,但是我還是不相信網絡,怕 Server端不知道要關閉,所以發送ACK后進入TIME_WAIT狀態,如果Server端沒有收到ACK則可以重傳。Client端等待了2MSL后依然沒有收到回復,則證明Server端已正常關閉,那好,我Client端也可以關閉連接了。“(在TIME_WAIT狀態中,如果TCP client端最后一次發送的ACK丟失了,它將重新發送。TIME_WAIT狀態中所需要的時間是依賴于實現方法的。典型的值為30秒、1分鐘和2分鐘。等待之后連接正式關閉,并且所有的資源(包括端口號)都被釋放。)
3.socket編程
(1).主機字節序:
大端:數據的高位字節存儲到內存的低地址位
小端:數據的高位字節存儲到內存的高地址位
套接字通信過程中操作的數據都是大端存儲的,包括:接收/發送的數據、IP地址、端口
PC機上數據的存儲默認使用的是小端
主機字節序到網絡字節序的轉換函數:htons、htonl;從網絡字節序到主機字節序的轉換函數:ntohs、ntohl
(2).socket函數:
創建套接字socket,返回文件描述符,這個文件描述符來操作內存,實現網絡通信
調用綁定函數bind,將文件描述符和本地的IP與端口進行綁定
調用監聽listen給監聽的套接字設置監聽
調用accept阻塞并等待接受客戶端的連接請求, 建立新的連接, 會得到一個新的文件描述符(通信的)
連接成功后,通過調用read和recv來接收數據,如果連接沒有斷開,接收數據的函數會阻塞等待數據到達,數據到達后函數解除阻塞,開始接收數據,當發送端斷開連接,接收端無法接收到任何數據,但是這時候就不會阻塞了,函數直接返回0
通過調用write和send發送數據
通過調用close來關閉套接字
三.HTTP協議
1.HTTP請求頭
Accept接收的介質類型
Accept-Charset接受的字符集
2.MFC中Http開發
CInternetSession,創建并初始化一個或多個同時的Internet 會話
CHttpConnection,包含一個構造函數和一個成員函數OpenRequest,使用HTTP協議來管理與服務器的連接
CHttpFile,提供請求和讀取 HTTP 服務器上數據和文件的功能;
3.Qt中Http開發
使用QNetworkReply,QNetworkRequest,QNetworkAccessManager
封裝成常用的同步和異步的Get請求,Post字串方式請求,Post鍵值對方式請求等
4.curl開源庫Http開發
libcurl是一個多協議的便于客戶端使用的URL傳輸庫,基于C語言,提供C語言的API接口,支持DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, Telnet 及TFTP這些協議,同時支持使用SSL證書的安全文件傳輸:HTTP POST, HTTP PUT, FTP 上傳, 基于HTTP形式的上傳、代理、Cookies、用戶加密碼的認證等多種應用場景。另外,libcurl是一個高移植性的庫,能在絕大多數系統上運行,包括Windows,Linux ,Mac OS,Solaris, NetBSD, FreeBSD, OpenBSD, HPUX AIX, Tru64, UnixWare, HURD, Amiga, BeOs, Ultrix, QNX, OpenVMS, RISC OS, Novell NetWare, DOS等
libcurl提供了兩種接口,分別是easy interface和multi interface。easy interface以同步的方式進行數據傳輸,執行curl函數時會一直阻塞到數據傳輸完畢后返回,且一次操作只能發送一次請求,如果要同時發送多個請求,必須使用多線程。 而multi interface以一種簡單的、非阻塞、異步的方式進行傳輸,它允許在一個線程中,同時提交多個相同類型的請求。 在使用multi interface之前,應該先掌握easy interface的基本使用。因為multi interface是建立在easy interface基礎之上的,它只是簡單的將多個easy handler添加到一個multi stack,而后同時傳輸而已