五渴语、TCP與UDP
1.傳輸層的作用
TCP/IP中有兩個具有代表性的傳輸層協(xié)議福扬,它們分別是TCP和UDP茵瀑。TCP提供可靠的通信傳輸间驮,而UDP則常被用于讓廣播和細節(jié)調控交給應用的通信傳輸。
傳輸層的定義
IP首部中有一個協(xié)議字段马昨,用來標識網絡層的上一層所采用的是哪一種傳輸層協(xié)議蜻牢。根據這個字段的協(xié)議號,就可以識別IP傳輸的數據部分究竟是TCP的內容偏陪,還是UDP的內容抢呆。同樣,傳輸層的TCP和UDP笛谦,為了識別自己所傳輸的數據部分究竟應該發(fā)給哪個應用抱虐,也設定了這樣一個編號。
通信處理
TCP/IP的眾多應用協(xié)議大多以客戶端/服務端的形式運行饥脑】已客戶端類似于客戶的意思,是請求的發(fā)起端灶轰。而服務端則表示提供服務的意思谣沸,是請求的處理端。另外笋颤,作為服務端的程序有必要提前啟動乳附,準備接收客戶端的請求。否則即使有客戶端的請求發(fā)過來伴澄,也無法做到響應的處理赋除。這些服務端程序在UNIX系統(tǒng)中叫做守護進程。例如HTTP的服務端程序是httpd(HTTP守護進程)非凌,而ssh的服務端程序是sshd(SSH守護進程)举农。在UNIX中并不需要將這些守護進程逐個啟動,而是啟動一個可以代表它們接收客戶端請求的inetd(互聯(lián)網守護進程)服務程序即可敞嗡。它是一種超級守護進程颁糟,該超級守護進程收到客戶端請求以后會創(chuàng)建新的進程并轉換為sshd等各個守護進程。確認一個請求究竟發(fā)給的是哪個服務端(守護進程)喉悴,可以通過所收到數據包的目標端口號輕松識別棱貌。
兩種傳輸層協(xié)議TCP和UDP
TCP:
TCP是面向連接的、可靠的流協(xié)議粥惧。流就是指不間斷的數據結構键畴,你可以把它想象成排水管道中的水流。當應用程序采用TCP發(fā)送消息時,雖然可以保證發(fā)送的順序起惕,但還是猶如沒有任何間隔的數據流發(fā)送給接收端涡贱。TCP為提供可靠性傳輸,實行"順序控制"或"重發(fā)控制"機制惹想。此外還具備"流控制(流量控制)"问词、"擁塞控制"、提高網絡利用率等眾多功能嘀粱。
UDP:
UDP是不具有可靠性的數據報協(xié)議激挪。細微的處理它會交給上層的應用去完成。在UDP的情況下锋叨,雖然可以確保發(fā)送消息的大小垄分,卻不能保證消息一定會到達。因此娃磺,應用有時會根據自己的需求進行重發(fā)處理薄湿。
TCP與UDP的區(qū)分:
TCP用于在傳輸層有必要實現可靠傳輸的情況。由于它是面向有連接并具備順序控制偷卧、重發(fā)控制等機制的豺瘤,所以它可以為應用提供可靠傳輸。
UDP主要用于那些對于高速傳輸和實時性有較高要求的通信或廣播通信听诸。
2.端口號
端口號的定義
數據鏈路和IP中的地址坐求,分別指的是MAC地址和IP地址。前者用來識別同一鏈路中不同的計算機晌梨,后者用來識別TCP/IP網絡中互連的主機和路由器桥嗤。在傳輸層中也有這種類似于地址的概念,那就是端口號派任。端口號用來識別同一臺計算機中進行通信的不同應用程序缘揪。因此台盯,它也被稱為程序地址。
通過IP地址壁袄、端口號司倚、協(xié)議號進行通信識別
TCP/IP或UDP/IP通信中通常采用5個信息來識別一個通信豆混。它們是"源IP地址"、"目標IP地址"动知、"協(xié)議號"皿伺、"源端口號"、"目標端口號"盒粮。只要其中某一項不同鸵鸥,則被認為是其他通信。
端口號如何確定
標準既定的端口號:
這種方法也叫靜態(tài)方法。它是指每個應用程序都有其指定的端口號妒穴。但并不是說可以隨意使用任何一個端口號宋税。每個端口號都有其對應的使用目的。
時序分配法:
服務器有必要確定監(jiān)聽端口號讼油,但是接收服務的客戶端沒必要確定端口號杰赛。在這種方法下,客戶端應用程序可以完全不用自己設置端口號矮台,而全權交給操作系統(tǒng)進行分配乏屯。操作系統(tǒng)可以為每個應用程序分配互不沖突的端口號。根據這種動態(tài)分配端口號的機制瘦赫,即使是同一客戶端程序發(fā)起多個TCP連接辰晕,識別這些通信連接的5部分數字也不會全部相同。
端口號與協(xié)議
端口號由其使用的傳輸層協(xié)議決定确虱。因此伞芹,不同的傳輸協(xié)議可以使用相同的端口號。數據到達IP層后蝉娜,會先檢查IP首部中的協(xié)議號唱较,再傳給相應協(xié)議的模塊。如果是TCP則傳給TCP模塊召川,如果是UDP則傳給UDP模塊去做端口號的處理南缓。即使是同一端口號,由于傳輸協(xié)議是各自獨立地進行處理荧呐,因此相互之間不會受到影響汉形。
3.UDP
UDP的特點及其目的
UDP不提供復雜的控制機制,利用IP提供面向無連接的通信服務倍阐。并且它是將應用程序發(fā)來的數據在收到的那一刻概疆,立刻按照原樣發(fā)送到網絡上的一種機制。即使是出現網絡擁堵的情況峰搪,UDP也無法進行流量控制等避免網絡擁塞的行為岔冀。此外,傳輸途中即使出現丟包概耻,UDP也不負責重發(fā)使套。甚至當出現包的到達順序亂掉時也沒有糾正功能。如果需要這些細節(jié)控制鞠柄,那么不得不交由采用UDP的應用程序去處理侦高。
由于UDP面向無連接,它可以隨時發(fā)送數據厌杜。再加上UDP本身的處理既簡單又高效奉呛,因此經常用于以下幾個方面:
- 包總量較少的通信(DNS、SNMP等)
- 視頻、音頻等多媒體通信(即時通信)
- 限定于LAN等待定網絡中的應用通信
- 廣播通信(廣播瞧壮、多播)
4.TCP
TCP的特點及其目的
TCP是對"傳輸登馒、發(fā)送、通信"進行"控制"的"協(xié)議"馁痴。它充分地實現了數據傳輸時各種控制功能谊娇,可以進行丟包時的重發(fā)控制,還可以對次序亂掉的分包進行順序控制罗晕。TCP作為一種面向有連接的協(xié)議济欢,只有在確認通信對端存在時才會發(fā)送數據,從而可以控制通信流量的浪費小渊。為了通過IP數據報實現可靠性傳輸法褥,需要考慮很多事情。例如數據的破壞酬屉、丟包半等、重復以及分片順序混亂等問題。TCP通過檢驗和呐萨、序列號杀饵、確認應答、重發(fā)控制谬擦、連接管理以及窗口控制等機制實現可靠性傳輸切距。
通過序列號與確認應答提高可靠性
在TCP中,當發(fā)送端的數據到達接收主機時惨远,接收端主機會返回一個已收到消息的通知谜悟。這個消息叫做確認應答。
序列號是按照順序給發(fā)送數據的每一個字節(jié)都標上號碼的編號北秽。接收端查詢接收數據TCP首部中的序列號和數據的長度葡幸,將自己下一步應該接受的序號作為應答返送回去。就這樣贺氓,通過序列號和確認應答號蔚叨,TCP可以實現可靠傳輸。
重發(fā)超時如何判斷
重發(fā)超時是指在重發(fā)數據之前掠归,等待確認應答到來的那個特定時間間隔缅叠。如果超過了這個時間仍未收到確認應答,發(fā)送端將進行數據重發(fā)虏冻。重發(fā)超時的計算既要考慮往返時間又要考慮偏差是有其原因的。根據網絡環(huán)境的不同往返時間可能會產生大幅度的搖擺弹囚,之所以發(fā)生這種情況是因為數據包的分段是經過不同路線到達的厨相。TCP/IP的目的是即使在這種環(huán)境下也要進行控制,盡量不要浪費網絡流量。
數據被重發(fā)之后若還是收不到確認應答蛮穿,則進行再次發(fā)送庶骄。此時,等待確認應答的時間將會以2倍践磅、4倍的指數函數延長单刁。此外,數據也不會被無限府适、反復地重發(fā)羔飞。達到一定重發(fā)次數之后,如果仍沒有任何確認應答返回檐春,就會判斷為網絡或對端主機發(fā)生了異常逻淌,強制關閉連接。并且通知應用通信異常強行終止疟暖。
連接管理
TCP提供面向有連接的通信傳輸卡儒。面向有連接是指在數據通信開始之前先做好通信兩端之間的準備工作。在數據通信之前俐巴,通過TCP首部發(fā)送一個SYN包作為建立連接的請求等待確認應答骨望。如果對端發(fā)來確認應答,則認為可以進行數據通信欣舵。如果對端的確認應答未能到達擎鸠,就不會進行數據通信。此外邻遏,在通信結束時會進行斷開連接的處理糠亩。
可以使用TCP首部用于控制的字段來管理TCP連接。一個連接的建立與斷開准验,正常過程至少需要來回發(fā)送7個包才能完成赎线。
TCP以段為單位發(fā)送數據
在建立TCP連接的同時,也可以確定發(fā)送數據包的單位糊饱,我們也可以稱其為"最大消息長度"(MSS)垂寥。最理想的情況是,最大消息長度正好是IP中不會被分片處理的最大數據長度另锋。
MSS是在三次握手的時候滞项,在兩端主機之間被計算得出。兩端的主機在發(fā)出建立連接請求時夭坪,會在TCP首部中寫入MSS選項文判,告訴對方自己的接口能夠適應的MSS的大小。然后會在兩者之間選擇一個較小的投入使用室梅。
利用窗口控制提高速度
TCP以1個段為單位戏仓,每發(fā)一個段進行一次確認應答的處理疚宇。這樣的傳輸方式有一個缺點。那就是赏殃,包的往返時間越長通信性能就越低敷待。為了解決這個問題,TCP引入了窗口這個概念仁热。即使在往返時間較長的情況下榜揖,它也能控制網絡性能的下降。窗口大小就是指無需等待確認應答而可以繼續(xù)發(fā)送數據的最大值抗蠢。
窗口控制與重發(fā)控制
在未使用窗口控制時举哟,沒有收到確認應答的數據都會被重發(fā)。而使用了窗口控制物蝙,某些確認應答即使丟失也無需重發(fā)炎滞。
其次,我們來考慮一下某個報文段丟失的情況诬乞。接收主機如果收到一個自己應該接收的序號以外的數據時册赛,會針對當前位置收到的數據返回確認應答。
當某一報文段丟失后震嫉,發(fā)送端會一直收到序號為1001的確認應答森瘪,這個確認應答提醒發(fā)送端,"我想接收的是從1001開始的數據"票堵。
流控制
TCP提供一種機制可以讓發(fā)送端根據接收端的實際接收能力控制發(fā)送的數據量扼睬。這就是所謂的流控制。它的具體操作是悴势,接收端主機向發(fā)送端主機通知自己可以接收數據的大小窗宇,于是發(fā)送端會發(fā)送不超過這個限度的數據。這大小限度被稱作窗口大小特纤。窗口大小的值就是由接收端主機決定的军俊。
當接收端從3001號開始的數據段后其緩沖區(qū)即滿,不得不暫時停止接收數據捧存。之后粪躬,在收到發(fā)送窗口更新通知后通信才得以繼續(xù)進行。
擁塞控制
有了窗口控制昔穴,收發(fā)主機之間可以不再以一個數據段為單位發(fā)送確認應答镰官,也能夠連續(xù)發(fā)送大量數據包。但是如果在通信剛開始時就發(fā)送大量數據吗货,也有可能會引發(fā)其他問題泳唠。TCP為了防止該問題的出現,在通信一開始時就會通過一個叫做慢啟動的算法得出的數值宙搬,對發(fā)送數據量進行控制警检。
首先孙援,為了在發(fā)送端調節(jié)所要發(fā)送數據的量害淤,定義了一個叫做"擁堵窗口"的概念扇雕。于是在慢啟動的時候,將這個擁堵窗口的大小設置為1個數據段(1 MSS)發(fā)送數據窥摄,之后每收到一次確認應答(ACK)镶奉,擁堵窗口的值就加1。在發(fā)送數據包時崭放,將擁堵窗口的大小與接收端主機通知的窗口大小做比較哨苛,然后按照它們當中較小那個值,發(fā)送比其還要小的數據量币砂。
如果重發(fā)采用超時機制建峭,那么擁塞窗口的初始值可以設置為1以后再進行慢啟動修正。有了上述這些機制决摧,就可以有限的減少通信開始時連續(xù)發(fā)包導致的網絡擁堵亿蒸,還可以避免網絡擁塞情況的發(fā)生。不過掌桩,隨著包的每次往返边锁,擁塞窗口也會以1、2波岛、4等指數函數的增長茅坛,擁堵狀況激增甚至導致網絡擁塞的發(fā)生。為了防止這些则拷,引入了慢啟動閥值的概念贡蓖。只要擁塞窗口的值超出這個閥值,在每收到一次確認應答時煌茬,只允許以下面這種比例放大擁塞窗口:
TCP的通信開始時斥铺,并沒有設置相應的慢啟動閾值。而是在超時重傳時宣旱,才會設置為當前擁塞窗口一半的大小仅父。由于重復確認應答而觸發(fā)的高速重發(fā)與超時重發(fā)機制的處理多少有些不同。因為前者要求至少3次的確認應答數據段到達對方主機后才觸發(fā)浑吟,相比后者網絡的擁堵要輕一些笙纤。而由重復確認應答進行高速重發(fā)控制時,慢啟動閾值的大小被設置為當時窗口大小的一半组力,然后將窗口的大小設置為該慢啟動閾值+3個數據段的大小省容。當TCP通信開始以后,網絡吞吐量會逐漸上升燎字,但是隨著網絡擁堵的發(fā)生吞吐量也會急劇下降腥椒。于是會再次進入吞吐量慢慢上升的過程阿宅。因此所謂TCP的吞吐量的特點就好像是在逐步占領網絡帶寬的感覺。
提高網絡利用率的規(guī)范
- Nagle算法
- 延遲確認應答:每收到兩個數據段發(fā)送一次的確認應答笼蛛。
- 捎帶應答:TCP的確認應答和回執(zhí)數據可以通過一個包發(fā)送洒放,必須得等到應用處理完數據并將作為回執(zhí)的數據返回為止,才能進行捎帶應答滨砍。
5.其他傳輸層協(xié)議
UDP-Lite
UDP-Lite(Lightweight User Datagram Protocol往湿,輕量級用戶數據報協(xié)議)是擴展UDP機能的一種傳輸層協(xié)議。在基于UDP的通信當中如果校驗和出現錯誤惋戏,所收到的包將被全部丟棄领追。然而,現實操作中响逢,有些應用在面對這種情況時并不希望把已經收到的所有包丟棄绒窑。如果將UDP中校驗和設置為無效,那么即使數據的一部分發(fā)生錯誤也不會將整個包廢棄舔亭。不過些膨,這不是一個很好的方法。因為如果發(fā)生的錯誤有可能是UDP首部中的端口號被破壞或是IP首部中的IP地址被破壞分歇,就會產生嚴重后果傀蓉。因此,不建議將校驗和關閉职抡。為了解決這些問題葬燎,UDP的修正版UDP-Lite協(xié)議就出現了。
UDP-Lite提供與UDP幾乎相同的功能缚甩,不過計算校驗和的范圍可以由應用自行決定谱净。這個范圍可以是包加上偽首部的校驗和計算,可以是首部與偽首部的校驗和計算擅威,也可以是首部壕探、偽首部與數據從起始到中間某個位置的校驗和計算。有了這樣的機制郊丛,就可以只針對不允許發(fā)生錯誤的部分進行校驗和的檢查李请。 對于其他部分,即使發(fā)生了錯誤厉熟,也會被忽略不計导盅。而這個包也不會被丟棄,而是直接傳給應用繼續(xù)處理揍瑟。
SCTP
SCTP(Stream Control Transmission Protocol白翻,流控制傳輸協(xié)議)與TCP一樣,都是對一種提供數據到達與否相關可靠性檢查的傳輸層協(xié)議绢片。
其主要特點如下:
以消息為單位收發(fā)
TCP中接收端并不知道發(fā)送端應用所決定的消息大小滤馍。在SCTP中卻可以岛琼。支持多重宿主
在有多個NIC的主機中,即使其中能夠使用的NIC發(fā)生變化巢株,也仍然可以繼續(xù)通信槐瑞。支持多數據流通信
TCP中建立多個連接以后才能進行通信的效果,在SCTP中一個連接就可以纯续。可以定義消息的生存期限
超過生存期限的消息随珠,不會被重發(fā)。
SCTP主要用于進行通信的應用之間發(fā)送眾多較小消息的情況猬错。這些較小的應用消息被稱作數據塊(Chunk),多個數據塊組成一個數據包茸歧。此外倦炒,SCTP具有支持多重宿主以及設定多個IP地址的特點。多重宿主是指同一臺主機具備多種網絡的接口软瞎。例如逢唤,筆記本電腦既可以連接以太網又可以連接無線LAN。同時使用以太網和無線LAN時涤浇,各自的NIC會獲取到不同的IP地址鳖藕。進行TCP通信,如果開始時使用的是以太網只锭,而后又切換為無線LAN,那么連接將會被斷開著恩。因為從SYN到FIN包必須使用同一個IP地址。然而在SCTP的情況下蜻展,由于可以管理多個IP地址使其同時進行通信喉誊,因此即使出現通信過程當中以太網與無線LAN之間的切換,也能夠保持通信不中斷纵顾。所以SCTP可以為具備多個NIC的主機提供更可靠的傳輸伍茄。
DCCP
DCCP(Datagram Congestion Control Protocol,數據報擁塞控制協(xié)議)是一個輔助UDP的嶄新的傳輸層協(xié)議施逾。UDP沒有擁塞控制機制敷矫。為此,當應用使用UDP發(fā)送大量數據包時極容易出現問題汉额〔苷蹋互聯(lián)網中的通信,即使使用UDP也應該控制擁塞闷愤。而這個機制開發(fā)人員很難將其融合至協(xié)議中整葡,于是便出現了DCCP這樣的規(guī)范。
DCCP具有如下幾個特點:
- 與UDP—樣讥脐,不能提供發(fā)送數據的可靠性傳輸遭居。
- 它面向連接啼器,具備建立連接與斷開連接的處理。在建立和斷開連接上是具有可靠性俱萍。
- 能夠根據網絡擁堵情況進行擁塞控制端壳。使用DCCP(RFC4340)應用可以根據自身特點選擇兩種方法進行擁塞控制。它們分別是"類似TCP(TCP-like)擁塞控制"和"TCP友好升級控制"(TCP-Friendly Rate Control)(RFC4341)枪蘑。
- 為了進行擁塞控制损谦,接收端收到包以后返回確認應答(ACK)。該確認應答將被用于重發(fā)與否的判斷岳颇。
6.UDP首部格式
源端口號
表示發(fā)送端端口號照捡,字段長16位。該字段是可選項话侧,有時可能不會設置源端口號栗精。沒有源端口號的時候該字段的值設置為0≌芭簦可用于不需要返回的通信中悲立。目標端口號
表示接收端端口,字段長度16位新博。包長度
該字段保存了UDP首部的長度跟數據的長度之和薪夕。單位為字節(jié)。校驗和
校驗和是為了提供可靠的UDP首部和數據而設計赫悄。
7.TCP首部格式
TCP首部比UDP首部要復雜得多原献。TCP中沒有表示包長度和數據長度的字段∩可由IP層獲知TCP的包長嚼贡,由TCP的包長可知數據的長度。
源端口號
表示發(fā)送端端口號同诫,字段長16位粤策。目標端口號
表示接收端端口號,字段長度16位序列號
字段長32位误窖。序列號是指發(fā)送數據的位置叮盘。每發(fā)送一次數據,就累加一次該數據字節(jié)數的大小霹俺。確認應答號
確認應答號字段長度32位柔吼。是指下一次應該收到的數據的序列號。實際上丙唧,它是指已收到確認應答號減一為止的數據愈魏。發(fā)送端收到這個確認應答以后可以認為在這個序號以前的數據都已經被正常接收。數據偏移
該字段表示TCP所傳輸的數據部分應該從TCP包的哪個位開始計算,當然也可以把它看作TCP首部的長度培漏。該字段長4位溪厘,單位為4字節(jié)。保留
該字段主要是為了以后擴展時使用牌柄,其長度為4位畸悬。控制位
字段長位8位,每一位從左至右分別為CWR珊佣、ECE蹋宦、URG、ACK咒锻、PSH冷冗、RST、SYN虫碉、FIN贾惦。這些控制標志也叫做控制位。
1.CWR標志與后面的ECE標志都用于IP首部的ECN字段敦捧。ECE標志為1時,則通知對方已將擁塞窗口縮小碰镜。
2.ECE標志表示ECN-Echo.置為1會通知通信對方兢卵,從對方到這邊的網絡有擁塞。在收到數據包的IP首部中ECN為1時將TCP首部中的ECE置為1绪颖。
3.URG該位為1時秽荤,表示包中有需要緊急處理的數據。對于需要緊急處理的數據柠横,會在后面的緊急指針中再進行解釋窃款。
4.ACK該位為1時,確認應答的字段變?yōu)橛行щ狗铡CP規(guī)定處理最初建立連接時的SYN包之外該位必須設置為1晨继。
5.PSH該位為1時,表示需要將收到的數據立即傳給上層應用協(xié)議搬俊。PSH為0時紊扬,則不需要立即傳而是先進行緩存。
6.RST該位為1時表示TCP連接中出現異常必須強制斷開連接唉擂。
7.SYN用于建立連接餐屎。SYN為1表示希望建立連接,并在其序列號的字段進行序列號初始值的設定玩祟。
8.FIN該位為1時腹缩,表示今后不會再有數據發(fā)送,希望斷開連接。當通信結束希望斷開連接時藏鹊,通信雙方的主機之間就可以相互交換FIN位置為1的TCP段润讥。窗口大小
該字段長為16位。用于通知從相同TCP首部的確認應答號所指位置開始能夠接收的數據大小伙判。校驗和
TCP的校驗和與UDP相似象对,區(qū)別在于TCP的校驗和無法關閉。緊急指針
該字段長為16位宴抚。只有在URG控制位為1時有效勒魔。該字段的數值表示本報文段中緊急數據的指針。選項
選項字段用于提高TCP的傳輸性能菇曲」诰睿可以根據數據偏移進行控制,所以其長度最大為40字節(jié)常潮。