五月综合缴情婷婷六月,色94色欧美sute亚洲线路二,日韩制服国产精品一区,色噜噜一区二区三区,香港三级午夜理伦三级三

您現(xiàn)在的位置: 365建站網(wǎng) > 365文章 > TCP、UDP以及HTTP的用法和區(qū)別

TCP、UDP以及HTTP的用法和區(qū)別

文章來源:365jz.com     點(diǎn)擊數(shù):872    更新時(shí)間:2018-10-19 09:28   參與評(píng)論

先來一個(gè)講TCP、UDP和HTTP關(guān)系的

1、TCP/IP是個(gè)協(xié)議組,可分為三個(gè)層次:網(wǎng)絡(luò)層、傳輸層和應(yīng)用層。
在網(wǎng)絡(luò)層有IP協(xié)議、ICMP協(xié)議、ARP協(xié)議、RARP協(xié)議和BOOTP協(xié)議。
在傳輸層中有TCP協(xié)議與UDP協(xié)議。
在應(yīng)用層有FTP、HTTP、TELNET、SMTP、DNS等協(xié)議。
因此,HTTP本身就是一個(gè)協(xié)議,是從Web服務(wù)器傳輸超文本到本地瀏覽器的傳送協(xié)議。

 

TCP 是基于 TCP 協(xié)議實(shí)現(xiàn)的網(wǎng)絡(luò)文本協(xié)議,屬于傳輸層。
UDP 是和TCP 對(duì)等的,屬于傳輸層,UDP 和 TCP 有重要的區(qū)別。

 

2、HTTP協(xié)議是建立在請(qǐng)求/響應(yīng)模型上的。首先由客戶建立一條與服務(wù)器的TCP鏈接,并發(fā)送一個(gè)請(qǐng)求到服務(wù)器,請(qǐng)求中包含請(qǐng)求方法、URI、協(xié)議版本以及相關(guān)的MIME樣式的消息。服務(wù)器響應(yīng)一個(gè)狀態(tài)行,包含消息的協(xié)議版本、一個(gè)成功和失敗碼以及相關(guān)的MIME式樣的消息。
HTTP/1.0為每一次HTTP的請(qǐng)求/響應(yīng)建立一條新的TCP鏈接,因此一個(gè)包含HTML內(nèi)容和圖片的頁面將需要建立多次的短期的TCP鏈接。一次TCP鏈接的建立將需要3次握手。
另外,為了獲得適當(dāng)?shù)膫鬏斔俣?,則需要TCP花費(fèi)額外的回路鏈接時(shí)間(RTT)。每一次鏈接的建立需要這種經(jīng)常性的開銷,而其并不帶有實(shí)際有用的數(shù)據(jù),只是保證鏈接的可靠性,因此HTTP/1.1提出了可持續(xù)鏈接的實(shí)現(xiàn)方法。HTTP/1.1將只建立一次TCP的鏈接而重復(fù)地使用它傳輸一系列的請(qǐng)求/響應(yīng)消息,因此減少了鏈接建立的次數(shù)和經(jīng)常性的鏈接開銷。

這里有必要再講一下三次握手的過程:

 

第一次握手:建立連接時(shí),客戶端發(fā)送syn包(syn=j)到服務(wù)器,并進(jìn)入SYN_SENT狀態(tài),等待服務(wù)器確認(rèn);SYN:同步序列編號(hào)(Synchronize Sequence Numbers)。

 

第二次握手:服務(wù)器收到syn包,必須確認(rèn)客戶的SYN(ack=j+1),同時(shí)自己也發(fā)送一個(gè)SYN包(syn=k),即SYN+ACK包,此時(shí)服務(wù)器進(jìn)入SYN_RECV狀態(tài);ACK:確認(rèn)字符(Acknowledgement)

 

第三次握手:客戶端收到服務(wù)器的SYN+ACK包,向服務(wù)器發(fā)送確認(rèn)包ACK(ack=k+1),此包發(fā)送完畢,客戶端和服務(wù)器進(jìn)入ESTABLISHED(TCP連接成功)狀態(tài),完成三次握手。

 

 

3、結(jié)論:雖然HTTP本身是一個(gè)協(xié)議,但其最終還是基于TCP的。不過,目前,有人正在研究基于TCP+UDP混合的HTTP協(xié)議。

Socket是什么呢?
       Socket是應(yīng)用層與TCP/IP協(xié)議族通信的中間軟件抽象層,它是一組接口。在設(shè)計(jì)模式中,Socket其實(shí)就是一個(gè)門面模式,它把復(fù)雜的TCP/IP協(xié)議族隱藏在Socket接口后面,對(duì)用戶來說,一組簡單的接口就是全部,讓Socket去組織數(shù)據(jù),以符合指定的協(xié)議。


 

 

TCP(Transmission Control Protocol,傳輸控制協(xié)議)是基于連接的協(xié)議,也就是說,在正式收發(fā)數(shù)據(jù)前,必須和對(duì)方建立可靠的連接。一個(gè)TCP連接必須要經(jīng)過三次“對(duì)話”才能建立起來,其中的過程非常復(fù)雜,我們這里只做簡單、形象的介紹,你只要做到能夠理解這個(gè)過程即可。我們來看看這三次對(duì)話的簡單過程:主機(jī)A向主機(jī)B發(fā)出連接請(qǐng)求數(shù)據(jù)包:“我想給你發(fā)數(shù)據(jù),可以嗎?”,這是第一次對(duì)話;主機(jī)B向主機(jī)A發(fā)送同意連接和要求同步(同步就是兩臺(tái)主機(jī)一個(gè)在發(fā)送,一個(gè)在接收,協(xié)調(diào)工作)的數(shù)據(jù)包:“可以,你什么時(shí)候發(fā)?”,這是第二次對(duì)話;主機(jī)A再發(fā)出一個(gè)數(shù)據(jù)包確認(rèn)主機(jī)B的要求同步:“我現(xiàn)在就發(fā),你接著吧!”,這是第三次對(duì)話。三次“對(duì)話”的目的是使數(shù)據(jù)包的發(fā)送和接收同步,經(jīng)過三次“對(duì)話”之后,主機(jī)A才向主機(jī)B正式發(fā)送數(shù)據(jù)。 

UDP(User Data Protocol,用戶數(shù)據(jù)報(bào)協(xié)議)是與TCP相對(duì)應(yīng)的協(xié)議。它是面向非連接的協(xié)議,它不與對(duì)方建立連接,而是直接就把數(shù)據(jù)包發(fā)送過去! 
  UDP適用于一次只傳送少量數(shù)據(jù)、對(duì)可靠性要求不高的應(yīng)用環(huán)境。比如,我們經(jīng)常使用“ping”命令來測試兩臺(tái)主機(jī)之間TCP/IP通信是否正常,其實(shí)“ping”命令的原理就是向?qū)Ψ街鳈C(jī)發(fā)送UDP數(shù)據(jù)包,然后對(duì)方主機(jī)確認(rèn)收到數(shù)據(jù)包,如果數(shù)據(jù)包是否到達(dá)的消息及時(shí)反饋回來,那么網(wǎng)絡(luò)就是通的。例如,在默認(rèn)狀態(tài)下,一次“ping”操作發(fā)送4個(gè)數(shù)據(jù)包(如圖2所示)。大家可以看到,發(fā)送的數(shù)據(jù)包數(shù)量是4包,收到的也是4包(因?yàn)閷?duì)方主機(jī)收到后會(huì)發(fā)回一個(gè)確認(rèn)收到的數(shù)據(jù)包)。這充分說明了UDP協(xié)議是面向非連接的協(xié)議,沒有建立連接的過程。正因?yàn)閁DP協(xié)議沒有連接的過程,所以它的通信效果高;但也正因?yàn)槿绱?,它的可靠性不如TCP協(xié)議高。QQ就使用UDP發(fā)消息,因此有時(shí)會(huì)出現(xiàn)收不到消息的情況。 

tcp協(xié)議和udp協(xié)議的差別 
             TCP       UDP 
是否連接     面向連接   面向非連接 
傳輸可靠性     可靠      不可靠 
應(yīng)用場合    傳輸大量數(shù)據(jù)  少量數(shù)據(jù) 
速度          慢          快


一、TCP與UDP區(qū)別總結(jié):

1、TCP面向連接(如打電話要先撥號(hào)建立連接);UDP是無連接的,即發(fā)送數(shù)據(jù)之前不需要建立連接

2、TCP提供可靠的服務(wù)。也就是說,通過TCP連接傳送的數(shù)據(jù),無差錯(cuò),不丟失,不重復(fù),且按序到達(dá);UDP盡最大努力交付,即不保證可靠交付


Tcp通過校驗(yàn)和,重傳控制,序號(hào)標(biāo)識(shí),滑動(dòng)窗口、確認(rèn)應(yīng)答實(shí)現(xiàn)可靠傳輸。如丟包時(shí)的重發(fā)控制,還可以對(duì)次序亂掉的分包進(jìn)行順序控制。


3、UDP具有較好的實(shí)時(shí)性,工作效率比TCP高,適用于對(duì)高速傳輸和實(shí)時(shí)性有較高的通信或廣播通信。


4.每一條TCP連接只能是點(diǎn)到點(diǎn)的;UDP支持一對(duì)一,一對(duì)多,多對(duì)一和多對(duì)多的交互通信


5、TCP對(duì)系統(tǒng)資源要求較多,UDP對(duì)系統(tǒng)資源要求較少。


二、為什么UDP有時(shí)比TCP更有優(yōu)勢?


UDP以其簡單、傳輸快的優(yōu)勢,在越來越多場景下取代了TCP,如實(shí)時(shí)游戲。


(1)網(wǎng)速的提升給UDP的穩(wěn)定性提供可靠網(wǎng)絡(luò)保障,丟包率很低,如果使用應(yīng)用層重傳,能夠確保傳輸?shù)目煽啃浴?/p>


(2)TCP為了實(shí)現(xiàn)網(wǎng)絡(luò)通信的可靠性,使用了復(fù)雜的擁塞控制算法,建立了繁瑣的握手過程,由于TCP內(nèi)置的系統(tǒng)協(xié)議棧中,極難對(duì)其進(jìn)行改進(jìn)。


采用TCP,一旦發(fā)生丟包,TCP會(huì)將后續(xù)的包緩存起來,等前面的包重傳并接收到后再繼續(xù)發(fā)送,延時(shí)會(huì)越來越大,基于UDP對(duì)實(shí)時(shí)性要求較為嚴(yán)格的情況下,采用自定義重傳機(jī)制,能夠把丟包產(chǎn)生的延遲降到最低,盡量減少網(wǎng)絡(luò)問題對(duì)游戲性造成影響。



三、UDP和TCP編程步驟也有些不同,如下:


TCP: 

TCP編程的服務(wù)器端一般步驟是: 

  1、創(chuàng)建一個(gè)socket,用函數(shù)socket();

            SOCKET SocketListen =socket(AF_INET,SOCK_STREAM, IPPROTO_TCP);

  2、設(shè)置socket屬性,用函數(shù)setsockopt(); * 可選 

  3、綁定IP地址、端口等信息到socket上,用函數(shù)bind(); 

            SOCKET_ERROR = bind(SocketListen,(const sockaddr*)&addr,sizeof(addr))

  4、開啟監(jiān)聽,用函數(shù)listen();

            SOCKET_ERROR == listen(SocketListen,2)

  5、接收客戶端上來的連接,用函數(shù)accept();

            SOCKET SocketWaiter = accept(SocketListen,

            _Out_    struct sockaddr *addr

            _Inout_  int *addrlen);

  6、收發(fā)數(shù)據(jù),用函數(shù)send()和recv(),或者read()和write(); 

  7、關(guān)閉網(wǎng)絡(luò)連接; 

            closesocket(SocketListen);closesocket(SocketWaiter);

  8、關(guān)閉監(jiān)聽; 

SOCK_STREAM這種的特點(diǎn)是面向連接的,即每次收發(fā)數(shù)據(jù)之前必須通過connect建立連接,而SOCK_DGRAM這種是User Datagram Protocol協(xié)議的網(wǎng)絡(luò)通訊,它是無連接的,不可靠的。

TCP編程的客戶端一般步驟是: 

  1、創(chuàng)建一個(gè)socket,用函數(shù)socket(); 

  2、設(shè)置socket屬性,用函數(shù)setsockopt();* 可選 

  3、綁定IP地址、端口等信息到socket上,用函數(shù)bind();* 可選 

  4、設(shè)置要連接的對(duì)方的IP地址和端口等屬性; 

  5、連接服務(wù)器,用函數(shù)connect(); 

  6、收發(fā)數(shù)據(jù),用函數(shù)send()和recv(),或者read()和write(); 

  7、關(guān)閉網(wǎng)絡(luò)連接;


int send(

  _In_  SOCKET s,         //向哪個(gè)socket發(fā)送,accept返回的socket。

  _In_  const char *buf,

  _In_  int len,

  _In_  int flags

);                               由于

send(SocketClient,(const char *)&fh,sizeof(fh),0);

recv(SocketClient,szbuf,sizeof(szbuf),0);

UDP:

與之對(duì)應(yīng)的UDP編程步驟要簡單許多,分別如下: 

  UDP編程的服務(wù)器端一般步驟是: 

  1、創(chuàng)建一個(gè)socket,用函數(shù)socket(); 

  2、設(shè)置socket屬性,用函數(shù)setsockopt();* 可選 

  3、綁定IP地址、端口等信息到socket上,用函數(shù)bind(); 

  4、循環(huán)接收數(shù)據(jù),用函數(shù)recvfrom(); 

  5、關(guān)閉網(wǎng)絡(luò)連接; 


UDP編程的客戶端一般步驟是: 

  1、創(chuàng)建一個(gè)socket,用函數(shù)socket(); 

  2、設(shè)置socket屬性,用函數(shù)setsockopt();* 可選 

  3、綁定IP地址、端口等信息到socket上,用函數(shù)bind();* 可選 

  4、設(shè)置對(duì)方的IP地址和端口等屬性; 

  5、發(fā)送數(shù)據(jù),用函數(shù)sendto(); 

  6、關(guān)閉網(wǎng)絡(luò)連接;



int recvfrom(

  _In_         SOCKET s,       //綁定的socket

  _Out_        char *buf,

  _In_         int len,

  _In_         int flags,

  _Out_        struct sockaddr *from,  //用來接收對(duì)方的

  _Inout_opt_  int *fromlen

);

int nres=recvfrom(pThis->m_socketListen,szBuf,sizeof(szBuf),0,(sockaddr*)&addrClient,&nSize);//0處標(biāo)志位

sendto(m_socketListen,szBuffer,nSize,0,(const sockaddr*)&addr,sizeof(sockaddr_in))

TCP和UDP是OSI模型中的運(yùn)輸層中的協(xié)議。TCP提供可靠的通信傳輸,而UDP則常被用于讓廣播和細(xì)節(jié)控制交給應(yīng)用的通信傳輸。


四、將socket設(shè)置為廣播屬性

bool optval=true;

setsockopt(m_socketListen,SOL_SOCKET,SO_BROADCAST,(const char *)&optval,sizeof(bool));


五、將Socket設(shè)置為非阻塞。

//bool benable=true;

//ioctlsocket(m_socketListen,FIONBIO,(u_long*)&benable);


6、Tcp頭,20字節(jié)


7、UDP首部,8個(gè)字節(jié)

如對(duì)本文有疑問,請(qǐng)?zhí)峤坏浇涣髡搲?,廣大熱心網(wǎng)友會(huì)為你解答?。?點(diǎn)擊進(jìn)入論壇

發(fā)表評(píng)論 (872人查看,0條評(píng)論)
請(qǐng)自覺遵守互聯(lián)網(wǎng)相關(guān)的政策法規(guī),嚴(yán)禁發(fā)布色情、暴力、反動(dòng)的言論。
昵稱:
最新評(píng)論
------分隔線----------------------------

其它欄目

· 建站教程
· 365學(xué)習(xí)

業(yè)務(wù)咨詢

· 技術(shù)支持
· 服務(wù)時(shí)間:9:00-18:00
365建站網(wǎng)二維碼

Powered by 365建站網(wǎng) RSS地圖 HTML地圖

copyright © 2013-2024 版權(quán)所有 鄂ICP備17013400號(hào)