網絡編程的本質是兩個設備之間的數據交換,固然,在計算機網絡中,設備主要指計算機。數據傳遞自己沒有多大的難度,不就是把一個設備中的數據發送給兩外一個設備,而後接受另一個設備反饋的數據。程序員
如今的網絡編程基本上都是基於請求/響應方式的,也就是一個設備發送請求數據給另一個,而後接收另外一個設備的反饋。編程
在網絡編程中,發起鏈接程序,也就是發送第一次請求的程序,被稱做客戶端(Client),等待其餘程序鏈接的程序被稱做服務器(Server)。客戶端程序能夠在須要的時候啓動,而服務器爲了可以時刻相應鏈接,則須要一直啓動。例如以打電話爲例,首先撥號的人相似於客戶端,接聽電話的人必須保持電話暢通相似於服務器。服務器
鏈接一旦創建之後,就客戶端和服務器端就能夠進行數據傳遞了,並且二者的身份是等價的。網絡
在一些程序中,程序既有客戶端功能也有服務器端功能,最多見的軟件就是BT、emule這類軟件了。tcp
下面來談一下如何創建鏈接以及如何發送數據。大數據
在現實生活中,若是要打電話則須要知道對應人的電話號碼,若是要寄信則須要知道收信人的地址。在網絡中也是這樣,須要知道一個設備的位置,則須要使用該設備的IP地址,具體的鏈接過程由硬件實現,程序員不須要過多的關心。spa
IP地址是一個規定,如今使用的是IPv4,既由4個0-255之間的數字組成,在計算機內部存儲時只須要4個字節便可。在計算機中,IP地址是分配給網卡的,每一個網卡有一個惟一的IP地址,若是一個計算機有多個網卡,則該臺計算機則擁有多個不一樣的IP地址,在同一個網絡內部,IP地址不能相同。IP地址的概念相似於電話號碼、身份證這樣的概念。操作系統
因爲IP地址不方便記憶,因此有專門創造了域名(Domain Name)的概念,其實就是給IP取一個字符的名字,例如163.com、sina.com等。IP和域名之間存在必定的對應關係。若是把IP地址類比成身份證號的話,那麼域名就是你的姓名。.net
其實在網絡中只能使用IP地址進行數據傳輸,因此在傳輸之前,須要把域名轉換爲IP,這個由稱做DNS的服務器專門來完成。計算機網絡
因此在網絡編程中,可使用IP或域名來標識網絡上的一臺設備。
爲了在一臺設備上能夠運行多個程序,人爲的設計了端口(Port)的概念,相似的例子是公司內部的分機號碼。
規定一個設備有216個,也就是65536個端口,每一個端口對應一個惟一的程序。每一個網絡程序,不管是客戶端仍是服務器端,都對應一個或多個特定的端口號。因爲0-1024之間多被操做系統佔用,因此實際編程時通常採用1024之後的端口號。
使用端口號,能夠找到一臺設備上惟一的一個程序。
因此若是須要和某臺計算機創建鏈接的話,只須要知道IP地址或域名便可,可是若是想和該臺計算機上的某個程序交換數據的話,還必須知道該程序使用的端口號。
小結
網絡編程就是使用IP地址,或域名,和端口鏈接到另外一臺計算機上對應的程序,按照規定的協議(數據格式)來交換數據,實際編程中創建鏈接和發送、接收數據在語言級已經實現,作的更多的工做是設計協議,以及編寫生成和解析數據的代碼罷了,而後把數據轉換成邏輯的結構顯示或控制邏輯便可。
對於初學者,或者沒有接觸過網絡編程的程序員,會以爲網絡編程涉及的知識很高深,很難,其實這是一種誤解,當你的語法熟悉之後,其實基本的網絡編程如今已經被實現的異常簡單了。
Socket就是爲網絡服務提供的一種機制。
通信的兩端都有Sokcet
網絡通信其實就是Sokcet間的通信
數據在兩個Sokcet間經過IO傳輸。
四次分手:
因爲TCP鏈接是全雙工的,所以每一個方向都必須單獨進行關閉。這個原則是當一方完成它的數據發送任務後就能發送一個FIN來終止這個方向的鏈接。收到一個 FIN只意味着這一方向上沒有數據流動,一個TCP鏈接在收到一個FIN後仍能發送數據。首先進行關閉的一方將執行主動關閉,而另外一方執行被動關閉。
(1)客戶端A發送一個FIN,用來關閉客戶A到服務器B的數據傳送。
(2)服務器B收到這個FIN,它發回一個ACK,確認序號爲收到的序號加1。和SYN同樣,一個FIN將佔用一個序號。
(3)服務器B關閉與客戶端A的鏈接,發送一個FIN給客戶端A。
(4)客戶端A發回ACK報文確認,並將確認序號設置爲收到序號加1。
1.爲何創建鏈接協議是三次握手,而關閉鏈接倒是四次握手呢?
這是由於服務端的LISTEN狀態下的SOCKET當收到SYN報文的建連請求後,它能夠把ACK和SYN(ACK起應答做用,而SYN起同步做用)放在 一個報文裏來發送。
但關閉鏈接時,當收到對方的FIN報文通知時,它僅僅表示對方沒有數據發送給你了;但未必你全部的數據都所有發送給對方了,因此你能夠 未必會立刻會關閉SOCKET,也即你可能還須要發送一些數據給對方以後,再發送FIN報文給對方來表示你贊成如今能夠關閉鏈接了,因此它這裏的ACK報 文和FIN報文多數狀況下都是分開發送的.
2.爲何TIME_WAIT狀態還須要等2MSL後才能返回到CLOSED狀態?
這是由於雖然雙方都贊成關閉鏈接了,並且握手的4個報文也都協調和發送完畢,按理能夠直接回到CLOSED狀態(就比如從SYN_SEND狀態到ESTABLISH狀態那樣);可是由於咱們必需要假想網絡是不可靠的,你沒法保證你最後發送的ACK報文會必定被對方收到,所以對方處於LAST_ACK狀態下的SOCKET可能會由於超時未收到ACK報文,而重發FIN報文,因此這個TIME_WAIT狀態的做用就是用來重發可能丟失的ACK報文。
udp: a、是面向無鏈接, 將數據及源的封裝成數據包中,不須要創建鏈接
b、每一個數據報的大小在限制64k內
c、因無鏈接,是不可靠協議
d、不須要創建鏈接,速度快
tcp: a、建議鏈接,造成傳輸數據的通道.
b、在鏈接中進行大數據量傳輸,以字節流方式
c 經過三次握手完成鏈接,是可靠協議
d 必須創建鏈接m效率會稍低