1.網(wǎng)絡(luò)編程
引用百度百科的知識(shí)弯汰,網(wǎng)絡(luò)編程即是使用套接字來達(dá)到進(jìn)程間通信目的的編程。網(wǎng)絡(luò)工程的主要工作是發(fā)送端把信息通過規(guī)定好的協(xié)議進(jìn)行組包卤档,在接收端接收并解析蝙泼,從而提取相應(yīng)的信息,達(dá)到通信的目的劝枣。網(wǎng)絡(luò)編程=IP address +
port+ TCP/UDP汤踏;千千萬萬臺(tái)計(jì)算機(jī)組成計(jì)算機(jī)網(wǎng)絡(luò),IP則能識(shí)別網(wǎng)絡(luò)中的計(jì)算機(jī)舔腾,端口識(shí)別該計(jì)算機(jī)運(yùn)行中的應(yīng)用程序溪胶。
1.1.套接字(IP address +port)
進(jìn)行網(wǎng)絡(luò)通信的所需的五種信息:連接使用的協(xié)議、套接字(源IP地址和目的IP地址以及源端口號(hào)和目的端口號(hào)的組合)稳诚。
常用的TCP/IP協(xié)議的三種套接字類型:
n流套接字(TCP協(xié)議);
n數(shù)據(jù)包套接字(UDP協(xié)議);
n原始套接字(IP哗脖、ICMO協(xié)議);
區(qū)別在于:原始套接字可以讀寫內(nèi)核沒有處理的IP數(shù)據(jù)包,而流套接字只能讀取TCP協(xié)議的數(shù)據(jù)扳还,數(shù)據(jù)包套接字只能讀取UDP協(xié)議的數(shù)據(jù)才避。
1.2.TCP協(xié)議
1.2.1.介紹
TCP(Transmission
Control Protocol傳輸控制協(xié)議)是一種面向連接的、可靠的氨距、基于字節(jié)流的傳輸層通信協(xié)議桑逝。
?在網(wǎng)絡(luò)七層模型中,我編寫的網(wǎng)絡(luò)應(yīng)用程序就位于應(yīng)用層俏让,而TCP屬于傳輸層楞遏,大家知道在應(yīng)用程序中我們用接口來分離實(shí)現(xiàn),在應(yīng)用層和傳輸層之間首昔,則是使用套接字來進(jìn)行分離寡喝。它就像是傳輸層為應(yīng)用層開的一個(gè)小口,應(yīng)用程序通過這個(gè)小口向遠(yuǎn)程發(fā)送數(shù)據(jù)勒奇,或者接收遠(yuǎn)程發(fā)來的數(shù)據(jù)预鬓;
1.2.2.功能
當(dāng)應(yīng)用層向TCP層發(fā)送用于網(wǎng)間傳輸?shù)摹⒂?位字節(jié)表示的數(shù)據(jù)流赊颠,TCP則把數(shù)據(jù)流分割成適當(dāng)長(zhǎng)度的報(bào)文段格二,最大傳輸段大小(MSS)通常受該計(jì)算機(jī)連接的網(wǎng)絡(luò)的數(shù)據(jù)鏈路層的最大傳送單元(MTU)限制巨税。之后TCP把數(shù)據(jù)包傳給IP層蟋定,由它來通過網(wǎng)絡(luò)將包傳送給接收端實(shí)體的TCP層。
TCP為了保證報(bào)文傳輸?shù)目煽?a href="" target="_blank">草添,就給每個(gè)包一個(gè)序號(hào)驶兜,同時(shí)序號(hào)也保證了傳送到接收端實(shí)體的包的按序接收。然后接收端實(shí)體對(duì)已成功收到的字節(jié)發(fā)回一個(gè)相應(yīng)的確認(rèn)(ACK)远寸;如果發(fā)送端實(shí)體在合理的往返時(shí)延(RTT)內(nèi)未收到確認(rèn)抄淑,那么對(duì)應(yīng)的數(shù)據(jù)(假設(shè)丟失了)將會(huì)被重傳。
1.2.3.三次握手
1.2.3.1.連接建立
TCP是因特網(wǎng)中的傳輸層協(xié)議驰后,使用三次握手協(xié)議建立連接肆资。當(dāng)主動(dòng)方發(fā)出SYN連接請(qǐng)求后,等待對(duì)方回答
SYN+ACK灶芝,并最終對(duì)對(duì)方的SYN執(zhí)行ACK確認(rèn)郑原。這種建立連接的方法可以防止產(chǎn)生錯(cuò)誤的連接唉韭,TCP使用的流量控制協(xié)議是可變大小的滑動(dòng)窗口協(xié)議。
TCP三次握手的過程如下:
1.客戶端發(fā)送SYN(SEQ=x)報(bào)文給服務(wù)器端犯犁,進(jìn)入SYN_SEND狀態(tài)属愤。
2.服務(wù)器端收到SYN報(bào)文,回應(yīng)一個(gè)SYN(SEQ=y)ACK(ACK=x+1)報(bào)文酸役,進(jìn)入SYN_RECV狀態(tài)住诸。
3.客戶端收到服務(wù)器端的SYN報(bào)文,回應(yīng)一個(gè)ACK(ACK=y+1)報(bào)文涣澡,進(jìn)入Established狀態(tài)贱呐。
三次握手完成,TCP客戶端和服務(wù)器端成功地建立連接入桂,可以開始傳輸數(shù)據(jù)了奄薇。
1.2.3.2.連接終止
建立一個(gè)連接需要三次握手,而終止一個(gè)連接要經(jīng)過四次握手事格,這是由TCP的半關(guān)閉(half-close)造成的惕艳。具體過程如下圖所示。
(1)某個(gè)應(yīng)用進(jìn)程首先調(diào)用close驹愚,稱該端執(zhí)行“主動(dòng)關(guān)閉”(active
close)远搪。該端的TCP于是發(fā)送一個(gè)FIN分節(jié),表示數(shù)據(jù)發(fā)送完畢逢捺。
(2)接收到這個(gè)FIN的對(duì)端執(zhí)行“被動(dòng)關(guān)閉”(passive close)谁鳍,這個(gè)FIN由TCP確認(rèn)。
注意:FIN的接收也作為一個(gè)文件結(jié)束符(end-of-file)傳遞給接收端應(yīng)用進(jìn)程劫瞳,放在已排隊(duì)等候該應(yīng)用進(jìn)程接收的任何其他數(shù)據(jù)之后倘潜,因?yàn)椋現(xiàn)IN的接收意味著接收端應(yīng)用進(jìn)程在相應(yīng)連接上再無額外數(shù)據(jù)可接收志于。
(3)一段時(shí)間后涮因,接收到這個(gè)文件結(jié)束符的應(yīng)用進(jìn)程將調(diào)用close關(guān)閉它的套接字。這導(dǎo)致它的TCP也發(fā)送一個(gè)FIN伺绽。
(4)接收這個(gè)最終FIN的原發(fā)送端TCP(即執(zhí)行主動(dòng)關(guān)閉的那一端)確認(rèn)這個(gè)FIN养泡。[1]
既然每個(gè)方向都需要一個(gè)FIN和一個(gè)ACK,因此通常需要4個(gè)分節(jié)奈应。
注意:
(1) “通忱窖冢”是指,某些情況下杖挣,步驟1的FIN隨數(shù)據(jù)一起發(fā)送肩榕,另外,步驟2和步驟3發(fā)送的分節(jié)都出自執(zhí)行被動(dòng)關(guān)閉那一端惩妇,有可能被合并成一個(gè)分節(jié)株汉。
(2)在步驟2與步驟3之間筐乳,從執(zhí)行被動(dòng)關(guān)閉一端到執(zhí)行主動(dòng)關(guān)閉一端流動(dòng)數(shù)據(jù)是可能的,這稱為“半關(guān)閉”(half-close)郎逃。
(3)當(dāng)一個(gè)Unix進(jìn)程無論自愿地(調(diào)用exit或從main函數(shù)返回)還是非自愿地(收到一個(gè)終止本進(jìn)程的信號(hào))終止時(shí)哥童,所有打開的描述符都被關(guān)閉挺份,這也導(dǎo)致仍然打開的任何TCP連接上也發(fā)出一個(gè)FIN褒翰。
無論是客戶還是服務(wù)器,任何一端都可以執(zhí)行主動(dòng)關(guān)閉匀泊。通常情況是优训,客戶執(zhí)行主動(dòng)關(guān)閉,但是某些協(xié)議各聘,例如揣非,HTTP/1.0卻由服務(wù)器執(zhí)行主動(dòng)關(guān)閉。
1.3.UDP
UDP是OSI參考模型中一種無連接的傳輸層協(xié)議躲因,它主要用于不要求分組順序到達(dá)的傳輸中早敬,分組傳輸順序的檢查與排序由應(yīng)用層完成,提供面向事務(wù)的簡(jiǎn)單不可靠信息傳送服務(wù)大脉。這里不作過多陳述搞监。