
1.談?wù)刪ttp
????????首先要談及的就是http協(xié)議,即超文本傳輸協(xié)議,這是一個應(yīng)用層協(xié)議,由請求和響應(yīng)組成,是一個標準的B/S模型,同時也是一個無連接的協(xié)議,這里的無連接是指每次只處理一個請求,同時也是一個無狀態(tài)的協(xié)議,就是說,次請求和上一次下一次請求都沒有任何關(guān)系。
????????大致的過程就是:建立連接—發(fā)送請求—響應(yīng)—斷開連接
????????一個http請求大致可分為:請求行,請求頭和請求體,響應(yīng)也一樣,一般真正有用的數(shù)據(jù)都存放在請求體和響應(yīng)體中。
2.談?wù)刪ttps
????????其實https就是http的安全版,增加了一個SSL和TLS協(xié)議
????????SSL/TLS協(xié)議提供了加密的機制,所以比http加密更加安全,一般http的端口說80,https的端口是443
????????提供驗證服務(wù),驗證本次會話實體身份的合法性。
????????提供加密服務(wù),強加密機制能保證通話過程中的消息不會被破譯
????????提供防篡改服務(wù),利用hash算法對消息進行簽名,通過驗證簽名保證通訊內(nèi)容不被篡改。
https通訊一次做了哪些事情
????1.客戶端向服務(wù)區(qū)發(fā)送SSL/TLS協(xié)議版本,加密算法,產(chǎn)生的隨機數(shù),以及需要的各種信息。
????2.服務(wù)器從客戶端支持的加密算法中選擇一組加密算法與hash算法,并且把自己的證書(包含網(wǎng)站地址,加密公鑰,證書頒發(fā)機構(gòu)等)發(fā)送給客戶端
????3.瀏覽器獲取到服務(wù)區(qū)證書后驗證其合法性,驗證頒發(fā)機構(gòu)是否合法,驗證訪問地址是否和正在訪問的地址一致
????4.瀏覽器生成一組隨機數(shù)并用服務(wù)器傳過來的公鑰加密,再用約定好的hash算法計算握手消息,發(fā)送到服務(wù)端。
????5.服務(wù)端接受到握手消息后,用自己的私鑰解密,并且用hash算法驗證,這樣雙方都有了此次通信的密鑰。
????6.服務(wù)器再使用密鑰加密一段握手消息,返回給瀏覽器,
????7.瀏覽器用密鑰解密,并使用hash算法驗證,確定算法以及密鑰。
—-至此,就可以用協(xié)商好的密鑰進行加密了通信了——
3.套接字通信
????????套接字通信是應(yīng)用層與TCP/IP協(xié)議族通信的中間抽象層,他是一組接口,應(yīng)用層通過調(diào)用這些接口發(fā)送和接收數(shù)據(jù),一般這種抽象層是由操作系統(tǒng)提供或者由JVM自己實現(xiàn)。
????????位于傳輸層和應(yīng)用層之間。
服務(wù)端套接字
????1.創(chuàng)建ServerSocket實例,傳入端口號等待阻塞。
????2.初始化底層的socket并將進行監(jiān)聽。
????3.創(chuàng)建socket底層數(shù)據(jù)結(jié)構(gòu),socket初始狀態(tài)為關(guān)閉。
????4.填入應(yīng)用層傳入的端口號,并設(shè)置socket狀態(tài)為監(jiān)聽。????
????5.服務(wù)端開始監(jiān)聽客戶端的訪問。
????6.客戶端訪問的時候經(jīng)過三次握手完成連接,準備接收socket連接
????7.為該連接創(chuàng)建一個新的套接字數(shù)據(jù)結(jié)構(gòu),根據(jù)到來的分組報文設(shè)置遠端的端口以及IP,由于完成了三次握手,把狀態(tài)設(shè)置為連接。
????8.建立好連接的底層套接字數(shù)據(jù)結(jié)構(gòu)會被放到一個隊列緩沖區(qū),提供應(yīng)用層讀取。
????7.ServerSocket實例調(diào)用accept方法后,即開始輪詢隊列緩沖區(qū),一旦隊列中有新的連接則創(chuàng)建并返回一個應(yīng)用層的socket實例。
????8.如此工作直到關(guān)閉
客戶端套接字
????1.確定通信目標,包括目標端口以及ip
????2.根據(jù)目標ip以及目標端口,在java應(yīng)用層創(chuàng)建一個socket實例。
????3.阻塞等待,準備進行系統(tǒng)底層相關(guān)工作。
????4.創(chuàng)建socket底層數(shù)據(jù)結(jié)構(gòu),socket初始狀態(tài)為關(guān)閉。
????5.向這個socket填入本地、遠程的地址和端口,并向遠程服務(wù)器發(fā)送請求連接,此時的狀態(tài)為正在連接
????6.與遠程服務(wù)器完成三次握手,此時狀態(tài)為連接建立完成。
????7.完成應(yīng)用層上的socket實例化,對這個socket進行操作,實現(xiàn)通信。
注意:套接字存在緩沖,socket的寫入并不是真正的寫入,會存在操作系統(tǒng)的緩沖區(qū),當超過緩沖區(qū)的大小,緩沖區(qū)會被一次性的讀取。
一個通信demo
服務(wù)層:
ServerSocket serversocket = new ServerSocket(8888);
Socket socket = serverSocket.accept();
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
DataInputStream dis = new DataInputStream(socket.getInputStream());
System.out.println(“….”+dis.readUTF());
dos.writeUTF(“….”);
socket.close();
serverSocket.close();
客戶端:
Socket socket = new Socket(“l(fā)ocalhost”,8888);
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
DataInputStream dis = new DataInputStream(socket.getInputStream());
System.out.println(“….”+dis.readUTF());
dos.writeUTF(“….”);
socket.close();
不管是多么復(fù)雜的web容器,都是通過這樣的建立起來的
單播通信:單個網(wǎng)絡(luò)節(jié)點之間的通信,一對一的模式
組播通信:為了優(yōu)化單播通信在某些場景下的不足,例如,一份數(shù)據(jù)要從某臺主機發(fā)送到其余若干臺主機上,這個時候如果還是使用單播通信的模式,數(shù)據(jù)必須依次發(fā)送給若干臺主機,,當主機的數(shù)量越來越多的時候,可能會導(dǎo)致網(wǎng)絡(luò)的阻塞,同時,這種方式效率太低。
廣播通信:也是一對多的模式,他向所有主機都發(fā)送消息,不管主機是否需要,雖然浪費了網(wǎng)絡(luò)資源,但是可以不用維護路由器與主機之間的成員關(guān)系
服務(wù)器模型:
1.單線程阻塞I/O模型:只有一個線程處理請求,模式是n:1,而阻塞I/O是指,讀取數(shù)據(jù)要等待客戶端發(fā)送數(shù)據(jù)并且把操作系統(tǒng)內(nèi)核復(fù)制到用戶進程中,這個時候才解除阻塞狀態(tài),寫數(shù)據(jù)回客戶端要等待用戶進程將數(shù)據(jù)寫入內(nèi)核并發(fā)送到客戶端后才解除阻塞。
2.多線程阻塞I/O:這個有多線程,但是I/O還是阻塞的,模式是1:1
3.單線程非阻塞I/O:當多個客戶端向服務(wù)端請求的時候,服務(wù)端會保存一個套接字連接列表中,應(yīng)用層線程對套接字列表輪詢嘗試讀取與寫入。對于讀取操作,如果成功讀取到若干數(shù)據(jù),則對讀取到的數(shù)據(jù)進行處理,如果讀取失敗,則在下一個循環(huán)繼續(xù)嘗試,寫入也一樣。
內(nèi)核遍歷套接字的事件監(jiān)測:
服務(wù)器可以有多個客戶端連接,應(yīng)用層向內(nèi)核請求讀寫事件列表,內(nèi)核遍歷所有套接字并生成對應(yīng)的可讀列表和可寫列表,readList表明了每個套接字是否可讀,例如套接字1的值為1,為可讀,套接字2的值為0,為不可讀
內(nèi)核基于回調(diào)事件的事件監(jiān)測:
當服務(wù)器有多個套接字連接,首先,應(yīng)用層告訴內(nèi)核每個套接字感興趣的事件,接著當客戶端發(fā)送數(shù)據(jù)過來的時候,對應(yīng)會有一個回調(diào)函數(shù),內(nèi)核從網(wǎng)卡復(fù)制數(shù)據(jù)成功以后即調(diào)回調(diào)函數(shù),將套接字1作為可讀事件event1加入到事件列表當中去,同樣,內(nèi)核發(fā)現(xiàn)網(wǎng)卡可寫的時候,就將套接字2作為可寫事件event2添加到事件列表當中去,最后,應(yīng)用層向內(nèi)核請求讀寫事件列表,內(nèi)核包含了event1,event2的事件列表返回應(yīng)用層,應(yīng)用層通過遍歷事件知道,套接字1有數(shù)據(jù)待讀取,而套接字2可寫入。