自己整理,方便平時常看。不喜勿噴
TCP/IP
從字面意思來看TCP/IP
是TCP
和IP
協議的合稱,但實際上TCP/IP
協議是指因特網整個TCP/IP
協議族。不同于ISO
模型的七個分層,TCP/IP
協議參考模型把所有的TCP/IP
系列協議歸類到四個抽象層中.
應用層:TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等
傳輸層:TCP,UDP
網絡層:IP,ICMP,OSPF,EIGRP,IGMP
數據鏈路層:SLIP,CSLIP,PPP,MTU
Socket概念
socket(套接字)
是通信的基石,是支持TCP/IP
協議的網絡通信的基本操作單元,包含進行網絡通信必須的五種信息:
- 連接使用的協議
- 本地主機的IP地址
- 本地進程的協議端口,
- 遠地主機的IP地址,
- 遠地進程的協議端口。
總的來說就是通信協議,協議端口,IP地址三個大的部分。
建立Socket
連接至少需要一對套接字,其中一個運行于客戶端,稱為ClientSocket,另一個運行于服務器端,稱為ServerSocket。套接字之間的連接過程分為三個步驟:
- 1.服務器監聽
- 2.客戶端請求
- 3.連接確認。
Socket
可以支持不同的傳輸層協議(TCP
或UDP
),當使用TCP
協議進行連接時,該Socket
連接就是一個TCP
連接,UDP
連接同理。
在本地進程通訊中我們可以使用PID
來唯一標示一個進程,但PID
只在本地唯一,網絡中的兩個進程PID
沖突幾率很大,這時候我們需要另辟它徑了,我們知道IP
層的ip
地址可以唯一標示主機,而`TCP層協議和端口號可以唯一標示主機的一個進程,這樣我們可以利用ip地址+協議+端口號唯一標示網絡中的一個進程。
socket是在應用層和傳輸層之間的一個抽象層,它把TCP/IP層復雜的操作抽象為幾個簡單的接口供應用層調用已實現進程在網絡中通信。
socket
起源于UNIX
,在Unix
一切皆文件哲學的思想下,socket
是一種"打開—讀/寫—關閉"模式的實現,服務器和客戶端各自維護一個"文件",在建立連接打開后,可以向自己文件寫入內容供對方讀取或者讀取對方內容,通訊結束時關閉文件。
通信流程
socket
是"打開—讀/寫—關閉"模式的實現,以使用TCP協議通訊的socket為例,其交互流程大概是這樣子的:
1、服務端
- 1.服務器根據地址類型
(ipv4,ipv6
)、socket
類型、協議創建socket
- 2.服務器為
socket
綁定ip
地址和端口號 - 3.服務器
socket
監聽端口號請求,隨時準備接收客戶端發來的連接,這時候服務器的socket
并沒有被打開.
2、客戶端(開始三次握手)
- 1、客戶端創建socket
- 2、客戶端打開socket,根據服務器ip地址和端口號試圖連接服務器socket。
3、服務端
- 1、服務器
socket
接收到客戶端socket
請求,被動打開,開始接收客戶端請求,直到客戶端返回連接信息。這時候socket
進入阻塞狀態,所謂阻塞即accept()
方法一直到客戶端返回連接信息后才返回,開始接收下一個客戶端諒解請求
4、客戶端
- 1、客戶端連接成功,向服務器發送連接狀態信息
5、服務器(三次握手完成)
- 1、服務器accept方法返回,連接成功
6、客戶端
- 1、客戶端向socket寫入信息
7、服務器
- 1、服務器讀取信息
8、客戶端
- 1、客戶端關閉
9、服務器端
- 1、服務器端關閉
三次握手
三次握手是為了確認客戶端跟服務器都能接受到對方的信息。
第一次握手:客戶端給服務器發包。此時服務器確認自己可以接收客戶端的包, 客戶端不確認服務器是否接收到了自己發的包。客戶端不知道
第二次握手,服務器端回復客戶端。 此時客戶端確認自己發的包被服務器收到,也確認自己可以正常接收服務器包,客戶端對此次通信沒有疑問了。服務器可以確認自己能接收到客戶端的包,但不能確認客戶端能否接收自己發的包。服務端不知道
第三次握手,客戶端回復服務器。 客戶端已經沒有疑問了,服務器也確認剛剛客戶端收到了自己的包。兩邊都沒有問題,開始通信。兩邊都知道。
形象比喻:
三次握手:
“喂,你聽得到嗎?”
“我聽得到呀,你聽得到我嗎?”
“我能聽到你,今天balabala……”
兩次握手:
“喂,你聽得到嗎?”
“我聽得到呀”
“喂喂,你聽得到嗎?”
“草,我聽得到呀!!!!”
“你TM能不能聽到我講話啊!!喂!”
“……”
四次握手:
“喂,你聽得到嗎?”
“我聽得到呀,你聽得到我嗎?”
“我能聽到你,你能聽到我嗎?”
“……不想跟傻逼說話”
再看一個解釋:
因為保證“ A說話B聽得到, B說話A也聽得到”這件事 并讓雙方都知道,剛好至少需要三次shake hands.
如果只讓一方確定這件事就夠了,那兩次握手足矣。
比如A發送"你聽得到我嗎";
B收到并回復"我聽得到,你聽得到我嗎?";
A收到這句話;(此時A已經能確定他們兩個說話對方都聽得到,但是B并不知道。)
所以A需要再回復一次:"我也聽得到"。
B收到后,此時A,B都確定了『我說話你聽得到,你說話我也聽得到』這件事。
...
正式解釋
第一次握手:客戶端嘗試連接服務器,向服務器發送syn包(同步序列編號Synchronize Sequence Numbers),syn=j,客戶端進入SYN_SEND狀態等待服務器確認
第二次握手:服務器接收客戶端syn包并確認(ack=j+1),同時向客戶端發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態
第三次握手:第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手
定睛一看,服務器socket與客戶端socket建立連接的部分其實就是大名鼎鼎的三次握手
四次和三次
握手過程中傳送的包里不包含數據,三次握手完畢后,客戶端與服務器才正式開始傳送數據。理想狀態下,TCP
連接一旦建立,在通信雙方中的任何一方主動關閉連接之前,TCP
連接都將被一直保持下去。斷開連接時服務器和客戶端均可以主動發起斷開TCP連接的請求,斷開過程需要經過“四次握手”。
TCP連接的拆除
TCP連接的拆除需要發送四個包,因此稱為四次握手(four-way handshake)。在socket編程中,任何一方執行close()操作即可產生握手(有地方稱為“揮手”)操作。
之所以有“三次握手”和“四次握手”的區別,是因為連接時當Server端收到Client端的SYN連接請求報文后,可以直接發送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。
但是關閉連接時,當Server端收到FIN報文時,很可能并不會立即關閉SOCKET,所以只能先回復一個ACK報文,告訴Client端,”你發的FIN報文我收到了”。只有等到我Server端所有的報文都發送完了,我才能發送FIN報文,因此不能一起發送。故需要四步握手。
Http
HTTP
協議即超文本傳送協議(HypertextTransfer Protocol
),是Web
聯網的基礎,也是手機聯網常用的協議之一,HTTP
協議是建立在TCP
協議之上的一種應用。
HTTP連接最顯著的特點是客戶端發送的每次請求都需要服務器回送響應,在請求結束后,會主動釋放連接。從建立連接到關閉連接的過程稱為“一次連接”。因此HTTP連接是一種“短連接”,要保持客戶端程序的在線狀態,需要不斷地向服務器發起連接請求。若服務器長時間無法收到客戶端的請求,則認為客戶端“下線”,若客戶端長時間無法收到服務器的回復,則認為網絡已經斷開。
HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer),是以安全為目標的HTTP通道,是HTTP的安全版。 在HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL。 HTTPS存在不同于HTTP的默認端口及一個加密/身份驗證層(在HTTP與TCP之間)。HTTP協議以明文方式發送內容,不提供任何方式的數據加密,如果攻擊者截取了Web瀏覽器和網站服務器之間的傳輸報文,就可以直接讀懂其中的信息,因此HTTP協議不適合傳輸一些敏感信息。
https協議需要到ca申請證書;http是超文本傳輸協議,信息是明文傳輸,https 則是具有安全性的ssl加密傳輸協議;http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,后者是443;http的連接很簡單,是無狀態的,HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議。
Socket連接與HTTP連接的不同
通常情況下Socket
連接就是TCP
連接,因此Socket
連接一旦建立,通信雙方即可開始相互發送數據內容,直到雙方連接斷開。但在實際應用中,客戶端到服務器之間的通信防火墻默認會關閉長時間處于非活躍狀態的連接而導致 Socket 連接斷連,因此需要通過輪詢告訴網絡,該連接處于活躍狀態。
而HTTP
連接使用的是“請求—響應”的方式,不僅在請求時需要先建立連接,而且需要客戶端向服務器發出請求后,服務器端才能回復數據。
之間的區別
- HTTP協議:簡單對象訪問協議,對應于應用層 ,HTTP協議是基于TCP連接的
- TCP協議: 對應于傳輸層
- IP協議: 對應于網絡層
TCP/IP是傳輸層協議,主要解決數據如何在網絡中傳輸;而HTTP是應用層協議,主要解決如何包裝數據。
- Socket是對TCP/IP協議的封裝,Socket本身并不是協議,而是一個調用接口(API),通過Socket,我們才能使用TCP/IP協議。
- Http連接:http連接就是所謂的短連接,即客戶端向服務器端發送一次請求,服務器端響應后連接即會斷掉。
- Socket連接:socket連接就是所謂的長連接,理論上客戶端和服務器端一旦建立起連接將不會主動斷掉;但是由于各種環境因素可能會是連接斷開,比如說:服務器端或客戶端主機down了,網絡故障,或者兩者之間長時間沒有數據傳輸,網絡防火墻可能會斷開該連接以釋放網絡資源。所以當一個
socket
連接中沒有數據的傳輸,那么為了維持連接需要發送心跳消息~~具體心跳消息格式是開發者自己定義的。