小雪尝禁果又粗又大的视频,人妻中文乱码在线网站,江苏少妇性BBB搡BBB爽爽爽,AV片在线观看免费

行業(yè)資訊

  • 首頁
  • 新聞中心
  • 行業(yè)資訊

Linux| |對于UDP的學(xué)習(xí)


2021年01月14日

UDP


# 前序

UDP(用戶數(shù)據(jù)報(bào)協(xié)議)沒有連接的,是面向數(shù)據(jù)報(bào)的,是不可靠

# 套接字

就是IP地址+端口號

IP地址:4字節(jié)

端口號:2字節(jié),也就是說范圍是0~65535

  • 端口號分為

  • 知名端口號

    • 0--1023:http,ssh,ftp,telnet等一些協(xié)議端口號都是固定的,對于操作系統(tǒng)來說是不能對其進(jìn)行分配的

    • 一些固定的端口號

    1. ssh服務(wù)器,使用22端口

    2. ftp服務(wù)器,使用21端口

    3. telnet服務(wù)器,使用23端口

    4. http服務(wù)器,使用80端口

    5. https服務(wù)器,使用443端口

  • 操作系統(tǒng)動態(tài)分配的端口號

    • 客戶端服務(wù)器的端口號,這個范圍的端口號操作系統(tǒng)可以對其進(jìn)行分配

  • 查看端口號

  • 
     
    1.  
      less /etc/services
    2.  
      //就可以查看Linux下所有的端口號了

     

IP地址的理解:

  • IP地址用來標(biāo)識一個主機(jī)

端口號的理解:

  • 端口號就是用來告訴操作系統(tǒng)要對于那一個進(jìn)程進(jìn)行操作,也就是說端口號就是用來標(biāo)識一個進(jìn)程

  • 一個端口號只可被一個進(jìn)程所占用,但是一個進(jìn)程可以擁有多個端口號,也就是進(jìn)程和端口號是一對多的關(guān)系

  • 當(dāng)我們寫一個程序使用端口號的時候,要避開這些知名端口號

【問題】

  1. 一個進(jìn)程是否可以bind多個端口號呢?

    • 可以,因?yàn)橐粋€進(jìn)程可以打開多個文件描述符,而每一個文件描述符都對應(yīng)著一個端口號,所以一個進(jìn)程可以綁定多個端口號

  2. 一個端口號是否可以被多個進(jìn)程bind?

    • 不可以

    • 如果一個進(jìn)程先綁定一個端口號,然后再fork一個子進(jìn)程,這樣的話就實(shí)現(xiàn)了多個進(jìn)程綁定一個端口號,但是不同的進(jìn)程綁定同一個端口號是不可以

    • TIME_WAIT狀態(tài),服務(wù)器不能立即重啟也說明不用進(jìn)程不能同時綁定同一個端口號

  3. 多個進(jìn)程可以監(jiān)聽同一個端口號嗎?

    • 可以。監(jiān)聽之前要進(jìn)行創(chuàng)建套接字->綁定ip::端口號->監(jiān)聽。我們可以在bind之前使用setsockopt函數(shù),設(shè)置套接字選項(xiàng),其中就包括REUSEADDR這個選項(xiàng),表明多個進(jìn)程可以復(fù)用bind函數(shù)中指定的地址和端口號

所以套接字就可以準(zhǔn)確的標(biāo)識一臺主機(jī)上的一個進(jìn)程,從而完成計(jì)算機(jī)之間的通信

計(jì)算機(jī)之間的通信:

  • 主機(jī)A的某個進(jìn)程與主機(jī)B上的另一個進(jìn)程進(jìn)行通信

 

# 網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換

對于數(shù)據(jù)在網(wǎng)絡(luò)中傳輸?shù)臅r候有著自己遵循的傳輸規(guī)則大端傳輸

對于主機(jī)上的數(shù)據(jù)的傳輸序列有著兩種:

  • 大端:即高位字節(jié)序放在低地址上

  • 小端:即低位字節(jié)序放在低地址上

  • 傳輸:均是先傳輸?shù)偷刂飞系臄?shù)據(jù)然后是高地址上的數(shù)據(jù)

所以對于主機(jī)上的數(shù)據(jù)傳輸?shù)臅r候傳輸?shù)骄W(wǎng)絡(luò)上的時候有可能導(dǎo)致數(shù)據(jù)錯誤(例如主機(jī)上是小端的時候,所以需要進(jìn)行轉(zhuǎn)換)

轉(zhuǎn)換函數(shù):


 
  1.  
    #include <arpa/inet.h>
  2.  
    ?
  3.  
    uint32_t htonl(uint32_t hostlong);
  4.  
    uint16_t htons(uint16 hostshort);
  5.  
    uint32_t ntohl(uint32_t netlong);
  6.  
    uint16_t ntohs(uint16_t netshort);

h:表示主機(jī)host name

n:表示網(wǎng)絡(luò)network

l:表示4字節(jié)long

s:表示2字節(jié)short

 

# 地址轉(zhuǎn)換函數(shù)

  • 字符串轉(zhuǎn)化為in_addr

    • in_addr_t inet_addr(const char* strptr)

  • in_addr轉(zhuǎn)化為字符串

    • char* inet_ntoa(struct in_addr inaddr)

    • 具有不可重入性,也就是不可多次調(diào)用,因?yàn)樵摵瘮?shù)自己在靜態(tài)區(qū)開辟一塊空間用來存放IP地址字符串的

 

# UDP協(xié)議

UDP協(xié)議端格式

插圖:UDP協(xié)議端格式

  • 16為UDP長度,表示整個數(shù)據(jù)報(bào)(UDP首部+UDP數(shù)據(jù))的最大長度(64KB)

  • 檢驗(yàn)和:如果校驗(yàn)和出錯,就會直接丟棄(檢驗(yàn)的是把首部和數(shù)據(jù)部分一起都檢驗(yàn))

    • 校驗(yàn)值首先在數(shù)據(jù)發(fā)送方通過特殊的算法計(jì)算得出,在傳遞到接收方之后,還要在重新計(jì)算。如果某個數(shù)據(jù)報(bào)在傳輸過程中被第三方篡改或者由于線路噪音等原因受到損壞,發(fā)送和接收方的校驗(yàn)計(jì)算值將不會相符,由此UDP協(xié)議可以檢驗(yàn)是否出錯。

  • 源端口號:在對方回信是選用,不需要時可用全0

  • 目的端口號:在終點(diǎn)交付報(bào)時必須要用到

  • 長度:UDP用戶數(shù)據(jù)報(bào)的長度,其最小值是8(僅有首部)

UDP的特點(diǎn)

  • 無連接:直到對端的IP和端口號就直接進(jìn)行傳輸,不需要建立連接

  • 不可靠:沒有確認(rèn)機(jī)制,沒有重傳機(jī)制;因?yàn)闆]有網(wǎng)絡(luò)故障該段無法發(fā)送到對方,UDP協(xié)議層也不會給應(yīng)用層返回任何錯誤信息

  • 面向數(shù)據(jù)報(bào):不能夠靈活的控制讀寫數(shù)據(jù)的次數(shù)和數(shù)量

  • 控制選項(xiàng)較少,數(shù)據(jù)傳輸過程中延遲小,數(shù)據(jù)傳輸效率高

面向數(shù)據(jù)報(bào)

  • 應(yīng)用層交給UDP多長的報(bào)文,UDP原樣發(fā)送,既不會拆分也不會合并

  • 例:用UDP傳輸100個字節(jié)的數(shù)據(jù)

    • 如果發(fā)送端調(diào)用一次sendto,發(fā)送100個字節(jié)。那么接收端也必須調(diào)用對應(yīng)的一次recvfrom,接收100字節(jié);而不能循環(huán)調(diào)用10次recvfrom,每次發(fā)送10個字節(jié)

UDP的緩存區(qū)

  • UDP沒有發(fā)送緩存區(qū),調(diào)用sendto之后會直接交給內(nèi)核,由內(nèi)核·將數(shù)據(jù)傳給網(wǎng)絡(luò)層協(xié)議進(jìn)行后續(xù)的傳輸動作。因?yàn)?strong>UDP是不面向連接的,所以沒有重發(fā)機(jī)制,也就不需要發(fā)送緩存區(qū)將已經(jīng)發(fā)送的數(shù)據(jù)保存下來為了發(fā)送失敗進(jìn)行重傳做準(zhǔn)備

  • UDP具有接收緩存區(qū)。但是這個接收緩存區(qū)不能保證收到的UDP報(bào)的順序和發(fā)送UDP報(bào)的順序一致;如果緩存區(qū)滿了,在到達(dá)的UDP數(shù)據(jù)就會被丟棄

UDP的Socket既能讀,也能寫,全雙工

UDP的使用注意事項(xiàng)

  • UDP協(xié)議首部中有一個16位的最大長度,也就是說一個UDP能傳輸?shù)臄?shù)據(jù)的最大長度是64K(包含UDP首部)。但是64K在當(dāng)今的互聯(lián)網(wǎng)環(huán)境下,是一個非常小的數(shù)字。如果我們需要傳輸?shù)臄?shù)據(jù)超過64K,就需要應(yīng)用層手動的分包,多次發(fā)送,并在接收端拼裝

  • UDP首部中校驗(yàn)和的計(jì)算方法有些特殊。在計(jì)算校驗(yàn)和時,要在UDP用戶數(shù)據(jù)報(bào)之前增加12個字節(jié)的偽首部

  • 偽首部既不向下傳輸也不想上遞送,而僅僅是為了計(jì)算校驗(yàn)和

  • 與IP數(shù)據(jù)報(bào)的校驗(yàn)和只檢驗(yàn)IP數(shù)據(jù)報(bào)的首部不同,UDP的校驗(yàn)和是把首部和數(shù)據(jù)部分一起都檢驗(yàn)

偽首部:

插圖:偽首部

基于UDP的應(yīng)用層的協(xié)議

  • NFS:網(wǎng)絡(luò)文件系統(tǒng)

  • TFTP:簡單文件傳輸文件協(xié)議

  • DHCP:動態(tài)主機(jī)配置協(xié)議

  • DNS:域名解析協(xié)議

面試題用UDP實(shí)現(xiàn)可靠傳輸?

參考TCP的可靠性機(jī)制,在應(yīng)用層實(shí)現(xiàn)類似的邏輯

  • 引用序列號,保證數(shù)據(jù)順序

  • 引入確認(rèn)應(yīng)答,確保對端收到了數(shù)據(jù)

  • 引入超時重傳,如果隔一段時間沒有應(yīng)答,就重發(fā)數(shù)據(jù)

 

1. 對于socket函數(shù)的使用

1.1 函數(shù)原型


 
  1.  
    int socket(int domain, int type, int protocol);
  2.  
    ?
  3.  
    domain: 領(lǐng)域
  4.  
    AF_INET:IPV4
  5.  
    AF_INET6:IPV6
  6.  
    type: 類型
  7.  
    SOCK_STREAM
  8.  
    SOCK_DGARM
  9.  
    protocol: 協(xié)議

1.2 函數(shù)的作用

在通信領(lǐng)域中創(chuàng)建一個未被綁定的套接字,并且返回一個文件描述符,可以在以后對套接字進(jìn)行操作的函數(shù)調(diào)用中使用

 

2. 對于bind函數(shù)的使用

2.1 函數(shù)原型

int bind(int socket, const struct sockaddr* address, socklen_t address_len);

2.2. 函數(shù)的作用

該函數(shù)采用先前創(chuàng)建好的套接字來對于IP地址以及端口號進(jìn)行綁定,也就是表示該套接字可以標(biāo)識出在一個網(wǎng)絡(luò)中一臺確定的主機(jī)并且主機(jī)中的進(jìn)程

 

3. 對于recvfrom函數(shù)的使用

3.1 函數(shù)原型


 
  1.  
    ssize_t recvfrom(int socket, void* restrict buffer, size_t length,
  2.  
                    int flags, struct sockaddr* restrict address,
  3.  
                   socklen_t* restrict address_len);
  4.  
    ?
  5.  
    socket:要接受那一個套接字的消息
  6.  
    buffer:用來接收消息的緩存區(qū)
  7.  
    length:接收的消息的長度
  8.  
    flags:類型
  9.  
    address:空指針或者存儲發(fā)送信息的sockaddr結(jié)構(gòu)
  10.  
    addless_len:指定地址參數(shù)指向的sockaddr結(jié)構(gòu)的長度
  11.  
    3.2 函數(shù)的作用

3.2 函數(shù)的作用  

用來接收從socket套接字發(fā)送來的消息。該套接字的sockaddr結(jié)構(gòu)也知道

 

4. 對于sendto函數(shù)的使用

4.1 函數(shù)原型


 
  1.  
    ssize_t recvfrom(int socket, const void* message, size_t length,
  2.  
                    int flags, const struct sockaddr* dest_addr,
  3.  
                   socklen_t* dest_len);

4.2 函數(shù)的作用

該函數(shù)是socket套接字從dest_addr出接收消息

 

5. 擴(kuò)展知識

5.1 netstat

netstat是一個用來監(jiān)控TCP/IP網(wǎng)絡(luò)非重要工具

語法:netstat [選項(xiàng)]

功能:查看網(wǎng)絡(luò)狀態(tài)

選項(xiàng):

  • -a,顯示所有連線的Socket

  • -c,持續(xù)列出網(wǎng)絡(luò)狀態(tài)

  • -n,直接使用ip地址,而不通過域名服務(wù)器,也就是顯示為數(shù)字

  • -l,顯示監(jiān)控中的服務(wù)器的Socket,僅列出監(jiān)聽(Listen)狀態(tài)下的Socket

  • -p,顯示正在使用Socket的程序的識別碼和名稱(PID/Program name)

  • -t,顯示TCP傳輸協(xié)議的連線狀況

  • -u,顯示UDP傳輸協(xié)議的連線狀況

  • -v,顯示指令執(zhí)行過程

  • -V,顯示版本信息

  • -x,顯示UNIX傳輸協(xié)議的連線狀況

  • -s,顯示網(wǎng)絡(luò)工作信息統(tǒng)計(jì)表

  • -h,在線幫助

 

5.2 pidof

查看服務(wù)器進(jìn)程id是非常方面

語法:pisdof [進(jìn)程名]

功能:通過進(jìn)程名,查看進(jìn)程id

 

5.3 scp命令

基于ssh登錄進(jìn)行的網(wǎng)絡(luò)安全的遠(yuǎn)程文件拷貝命令

例:要將自己當(dāng)前路徑下的clinet文件發(fā)送到主機(jī)IP為192.168.153.140的home目錄下

scp ./clinet root@192.168.153.140:/home

 

 

5.4 關(guān)于防火墻的命令

  • 啟動:systemctl start firewalld

  • 關(guān)閉:systemctl stop firewalld

  • 查看狀態(tài):systemctl status firewalld

  • 開機(jī)禁用:systemctl disable firewalld

  • 開機(jī)啟用:systemctl enable firewalld

# 對于UDP書寫服務(wù)器的思路

由于UDP是無連接的,所以對于兩個處于同一局域網(wǎng)下計(jì)算機(jī)的進(jìn)程之間通信,所以是不需要兩臺計(jì)算機(jī)之間的進(jìn)程進(jìn)行連接的,對于UDP使用的接口是需要包含知道從哪里接收消息的,要發(fā)送消息到哪里的。

  • 實(shí)現(xiàn)本地通信

    • 服務(wù)器

      • 只需要服務(wù)器創(chuàng)建一個套接字

      • 使該套接字對于本地地址(127.0.0.1)進(jìn)行綁定,并且綁定一個端口號(1024--65535)就行了

        • 綁定本地地址是為了對于本地計(jì)算機(jī)的兩個進(jìn)程進(jìn)程通信,而綁定端口號是為了綁定一個進(jìn)程,是為了對于客戶端進(jìn)行發(fā)送消息到服務(wù)器的時候,可以找到服務(wù)器

      • 然后就接受客戶端發(fā)來的消息

      • 對于客戶端的消息進(jìn)行處理然后就可以再次將處理后的消息進(jìn)行返回

      • 插圖:服務(wù)器流程

    • 客戶端

      • 綁定一個套接字

        • 為了綁定一個進(jìn)程,可以和服務(wù)器進(jìn)行通信,將消息發(fā)送過去的時候要讓服務(wù)器知道是哪一個進(jìn)程再和他進(jìn)程通信

      • 客戶端只需要向服務(wù)器發(fā)送消息

      • 然后再次從客戶端接收消息就好了,不需要考慮要進(jìn)行連接

      • 插圖:客戶端流程

  • 實(shí)現(xiàn)處于同一局域網(wǎng)下的不同主機(jī)間進(jìn)行通信

    • 服務(wù)器

      • 和本地通信的一致,只是對于套接字綁定的ip地址不一樣了

      • 也對于套接字要綁定該局域網(wǎng)的ip地址以及一個端口號,不需要在綁定本地地址(127.0.0.1)

        • 這樣的話處于同一局域網(wǎng)下的計(jì)算機(jī)的進(jìn)程就可以進(jìn)行通信了

    • 客戶端

      • 對于客戶端來說沒有任何改變,仍然是只需要知道服務(wù)器的ip和端口號就行了

 

# 對于UDP服務(wù)器要注意的問題

  • 啟動客戶端

    • 啟動客戶端的時候必須給客戶端輸入一個ip地址和端口號,這個ip地址和端口號也就是要知道客戶端要發(fā)送消息給哪一個服務(wù)器進(jìn)行發(fā)送

  • 啟動服務(wù)器

    • 必須要給服務(wù)器綁定一個ip地址和端口號,也就是要注意該服務(wù)器處于該計(jì)算機(jī)上的哪一個進(jìn)程上


客服