国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux關于UDP的學習詳細講解

jf_f8pIz0xS ? 來源:CSDN技術社區 ? 作者:_YKitty ? 2021-05-02 16:42 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前序

UDP(用戶數據報協議)沒有連接的,是面向數據報的,是不可靠

套接字

就是IP地址+端口

IP地址:4字節

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

端口號分為

知名端口號

0--1023:http,ssh,ftp,telnet等一些協議端口號都是固定的,對于操作系統來說是不能對其進行分配的

一些固定的端口號

ssh服務器,使用22端口

ftp服務器,使用21端口

telnet服務器,使用23端口

http服務器,使用80端口

https服務器,使用443端口

操作系統動態分配的端口號

客戶端服務器的端口號,這個范圍的端口號操作系統可以對其進行分配

查看端口號

less /etc/services

//就可以查看Linux下所有的端口號了

IP地址的理解:

IP地址用來標識一個主機

端口號的理解:

端口號就是用來告訴操作系統要對于那一個進程進行操作,也就是說端口號就是用來標識一個進程

一個端口號只可被一個進程所占用,但是一個進程可以擁有多個端口號,也就是進程和端口號是一對多的關系

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

【問題】

一個進程是否可以bind多個端口號呢?

可以,因為一個進程可以打開多個文件描述符,而每一個文件描述符都對應著一個端口號,所以一個進程可以綁定多個端口號

一個端口號是否可以被多個進程bind?

不可以

如果一個進程先綁定一個端口號,然后再fork一個子進程,這樣的話就實現了多個進程綁定一個端口號,但是不同的進程綁定同一個端口號是不可以的

TIME_WAIT狀態,服務器不能立即重啟也說明不用進程不能同時綁定同一個端口號

多個進程可以監聽同一個端口號嗎?

可以。監聽之前要進行創建套接字-》綁定ip::端口號-》監聽。我們可以在bind之前使用setsockopt函數,設置套接字選項,其中就包括REUSEADDR這個選項,表明多個進程可以復用bind函數中指定的地址和端口號

所以套接字就可以準確的標識一臺主機上的一個進程,從而完成計算機之間的通信

計算機之間的通信:

主機A的某個進程與主機B上的另一個進程進行通信

網絡字節序轉換

對于數據在網絡中傳輸的時候有著自己遵循的傳輸規則大端傳輸

對于主機上的數據的傳輸序列有著兩種:

大端:即高位字節序放在低地址上

小端:即低位字節序放在低地址上

傳輸:均是先傳輸低地址上的數據然后是高地址上的數據

所以對于主機上的數據傳輸的時候傳輸到網絡上的時候有可能導致數據錯誤(例如主機上是小端的時候,所以需要進行轉換)

轉換函數:

#include 《arpa/inet.h》

uint32_t htonl(uint32_t hostlong);

uint16_t htons(uint16 hostshort);

uint32_t ntohl(uint32_t netlong);

uint16_t ntohs(uint16_t netshort);

h:表示主機host name

n:表示網絡network

l:表示4字節long

s:表示2字節short

地址轉換函數

字符串轉化為in_addr

in_addr_t inet_addr(const char* strptr)

in_addr轉化為字符串

char* inet_ntoa(struct in_addr inaddr)

具有不可重入性,也就是不可多次調用,因為該函數自己在靜態區開辟一塊空間用來存放IP地址字符串的

UDP協議

UDP協議端格式

插圖:UDP協議端格式

16為UDP長度,表示整個數據報(UDP首部+UDP數據)的最大長度(64KB)

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

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

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

目的端口號:在終點交付報時必須要用到

長度:UDP用戶數據報的長度,其最小值是8(僅有首部)

UDP的特點

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

不可靠:沒有確認機制,沒有重傳機制;因為沒有網絡故障該段無法發送到對方,UDP協議層也不會給應用層返回任何錯誤信息

面向數據報:不能夠靈活的控制讀寫數據的次數和數量

控制選項較少,數據傳輸過程中延遲小,數據傳輸效率高

面向數據報

應用層交給UDP多長的報文,UDP原樣發送,既不會拆分也不會合并

例:用UDP傳輸100個字節的數據

如果發送端調用一次sendto,發送100個字節。那么接收端也必須調用對應的一次recvfrom,接收100字節;而不能循環調用10次recvfrom,每次發送10個字節

UDP的緩存區

UDP沒有發送緩存區,調用sendto之后會直接交給內核,由內核·將數據傳給網絡層協議進行后續的傳輸動作。因為UDP是不面向連接的,所以沒有重發機制,也就不需要發送緩存區將已經發送的數據保存下來為了發送失敗進行重傳做準備

UDP具有接收緩存區。但是這個接收緩存區不能保證收到的UDP報的順序和發送UDP報的順序一致;如果緩存區滿了,在到達的UDP數據就會被丟棄

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

UDP的使用注意事項

UDP協議首部中有一個16位的最大長度,也就是說一個UDP能傳輸的數據的最大長度是64K(包含UDP首部)。但是64K在當今的互聯網環境下,是一個非常小的數字。如果我們需要傳輸的數據超過64K,就需要應用層手動的分包,多次發送,并在接收端拼裝

UDP首部中校驗和的計算方法有些特殊。在計算校驗和時,要在UDP用戶數據報之前增加12個字節的偽首部

偽首部既不向下傳輸也不想上遞送,而僅僅是為了計算校驗和

與IP數據報的校驗和只檢驗IP數據報的首部不同,UDP的校驗和是把首部和數據部分一起都檢驗

偽首部:

插圖:偽首部

基于UDP的應用層的協議

NFS:網絡文件系統

TFTP:簡單文件傳輸文件協議

DHCP:動態主機配置協議

DNS:域名解析協議

面試題:用UDP實現可靠傳輸?

參考TCP的可靠性機制,在應用層實現類似的邏輯

引用序列號,保證數據順序

引入確認應答,確保對端收到了數據

引入超時重傳,如果隔一段時間沒有應答,就重發數據

1. 對于socket函數的使用

1.1 函數原型

int socket(int domain, int type, int protocol);

domain: 領域

AF_INET:IPV4

AF_INET6:IPV6

type: 類型

SOCK_STREAM

SOCK_DGARM

protocol: 協議

1.2 函數的作用

在通信領域中創建一個未被綁定的套接字,并且返回一個文件描述符,可以在以后對套接字進行操作的函數調用中使用

2. 對于bind函數的使用

2.1 函數原型

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

2.2. 函數的作用

該函數采用先前創建好的套接字來對于IP地址以及端口號進行綁定,也就是表示該套接字可以標識出在一個網絡中一臺確定的主機并且主機中的進程

3. 對于recvfrom函數的使用

3.1 函數原型

ssize_t recvfrom(int socket, void* restrict buffer, size_t length,

int flags, struct sockaddr* restrict address,

socklen_t* restrict address_len);

socket:要接受那一個套接字的消息

buffer:用來接收消息的緩存區

length:接收的消息的長度

flags:類型

address:空指針或者存儲發送信息的sockaddr結構

addless_len:指定地址參數指向的sockaddr結構的長度

3.2 函數的作用

用來接收從socket套接字發送來的消息。該套接字的sockaddr結構也知道

4. 對于sendto函數的使用

4.1 函數原型

ssize_t recvfrom(int socket, const void* message, size_t length,

int flags, const struct sockaddr* dest_addr,

socklen_t* dest_len);

4.2 函數的作用

該函數是socket套接字從dest_addr出接收消息

5. 擴展知識

5.1 netstat

netstat是一個用來監控TCP/IP網絡非重要工具

語法:netstat [選項]

功能:查看網絡狀態

選項:

-a,顯示所有連線的Socket

-c,持續列出網絡狀態

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

-l,顯示監控中的服務器的Socket,僅列出監聽(Listen)狀態下的Socket

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

-t,顯示TCP傳輸協議的連線狀況

-u,顯示UDP傳輸協議的連線狀況

-v,顯示指令執行過程

-V,顯示版本信息

-x,顯示UNIX傳輸協議的連線狀況

-s,顯示網絡工作信息統計表

-h,在線幫助

5.2 pidof

查看服務器進程id是非常方面

語法:pisdof [進程名]

功能:通過進程名,查看進程id

5.3 scp命令

基于ssh登錄進行的網絡安全的遠程文件拷貝命令

例:要將自己當前路徑下的clinet文件發送到主機IP為192.168.153.140的home目錄下

scp 。/clinet root@192.168.153.140:/home

5.4 關于防火墻的命令

啟動:systemctl start firewalld

關閉:systemctl stop firewalld

查看狀態:systemctl status firewalld

開機禁用:systemctl disable firewalld

開機啟用:systemctl enable firewalld

# 對于UDP書寫服務器的思路

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

實現本地通信

服務器

只需要服務器創建一個套接字

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

綁定本地地址是為了對于本地計算機的兩個進程進程通信,而綁定端口號是為了綁定一個進程,是為了對于客戶端進行發送消息到服務器的時候,可以找到服務器

然后就接受客戶端發來的消息

對于客戶端的消息進行處理然后就可以再次將處理后的消息進行返回

插圖:服務器流程

客戶端

綁定一個套接字

為了綁定一個進程,可以和服務器進行通信,將消息發送過去的時候要讓服務器知道是哪一個進程再和他進程通信

客戶端只需要向服務器發送消息

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

插圖:客戶端流程

實現處于同一局域網下的不同主機間進行通信

服務器

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

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

這樣的話處于同一局域網下的計算機的進程就可以進行通信了

客戶端

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

對于UDP服務器要注意的問題

啟動客戶端

啟動客戶端的時候必須給客戶端輸入一個ip地址和端口號,這個ip地址和端口號也就是要知道客戶端要發送消息給哪一個服務器進行發送

啟動服務器

必須要給服務器綁定一個ip地址和端口號,也就是要注意該服務器處于該計算機上的哪一個進程上
編輯:lyn

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    88

    文章

    11763

    瀏覽量

    219079
  • 服務器
    +關注

    關注

    14

    文章

    10256

    瀏覽量

    91517
  • UDP
    UDP
    +關注

    關注

    0

    文章

    334

    瀏覽量

    35422
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    零知IDE——基于STM32與W5500的UDP通信實現溫濕度監控

    本文詳細介紹了一個基于零知增強板(STM32F407VET6)和W5500以太網模塊的UDP通信溫濕度監控系統。系統通過DHT11傳感器采集數據,通過W5500實現UDP通信,支持遠程LED控制
    的頭像 發表于 02-28 15:26 ?1505次閱讀
    零知IDE——基于STM32與W5500的<b class='flag-5'>UDP</b>通信實現溫濕度監控

    Linux磁盤管理指令合集:從查看、分區到修復

    Linux 服務器運維或日常使用中,磁盤管理是高頻操作 —— 無論是排查磁盤空間不足的問題,還是新增硬盤后的分區配置,都離不開一系列核心指令。今天就為大家整理一份「Linux 磁盤管理指令操作集」,按功能分類講解,附帶示例和
    的頭像 發表于 02-03 16:07 ?2043次閱讀
    <b class='flag-5'>Linux</b>磁盤管理指令合集:從查看、分區到修復

    【「Linux 設備驅動開發(第 2 版)」閱讀體驗】+讀深入理解Linux內核內存分配

    每個內存地址是虛擬的,不是直接指向RAM中的任何地址。當用戶訪問內存中的存儲單元時,都會進行地址轉換以匹配相應的物理內存。書籍的第10章討論了五個主題,對Linux內核內存分配進行詳細講解。 接著
    發表于 01-16 20:05

    linux-arm開發環境的簡單配置

    linux-arm開發環境簡單配置 關于linux-arm開發環境簡單配置是ARM學習的第一步,很多初學者會在這問題上糾結很久都不能配置好開發環境。推薦大家看一下韋東山視頻,講得很
    發表于 01-13 07:56

    【「Linux 設備驅動開發(第 2 版)」閱讀體驗】+讀內核處理的核心輔助函數

    理解Linux內核時間管理”知識點。 Linux內核時間管理部分,作者圖文并茂,詳細介紹了其實現流程。 通過對這幾章節的學習,體會到作者在知識點介紹方面承上啟下,層層深入,由常見的調用
    發表于 01-10 22:08

    DR1平臺Linux應用開發指南:含GDB調試、Python及MQTT實戰

    本文為創龍科技DR1 系列評估板 Linux 應用開發手冊,系統講解開發環境搭建、GDB 調試、多類型應用案例及 MQTT 通信實現。核心內容包括 LinuxSDK 與工具鏈配置、GDB 遠程調試
    的頭像 發表于 01-05 16:48 ?4580次閱讀
    DR1平臺<b class='flag-5'>Linux</b>應用開發指南:含GDB調試、Python及MQTT實戰

    TCP和UDP的區別

    首先概括一下基本的區別: TCP是一個面向連接的、可靠的、基于字節流的傳輸層協議。 而UDP是一個面向無連接的傳輸層協議。(就這么簡單,其它TCP的特性也就沒有了)。 具體來分析,和 UDP
    發表于 12-09 07:24

    【免費送書】成為硬核Linux開發者:《Linux 設備驅動開發(第 2 版)》

    Linux系統的設備驅動開發,一直給人門檻較高的印象,主要因內核機制抽象、需深度理解硬件原理、開發調試難度大所致。2021年,一本講解驅動開發的專著問世即獲市場青睞,暢銷近萬冊——這便是《Linux設備驅動開發》。
    的頭像 發表于 11-18 08:06 ?1435次閱讀
    【免費送書】成為硬核<b class='flag-5'>Linux</b>開發者:《<b class='flag-5'>Linux</b> 設備驅動開發(第 2 版)》

    【書籍評測活動NO.67】成為硬核Linux開發者:《Linux 設備驅動開發(第 2 版)》

    ,以獲得最佳學習效果。第1篇:Linux內核開發基礎開篇從環境搭建入手,詳細講解如何獲取Linux內核源碼,在x86宿主機上配置ARM的
    發表于 11-17 17:52

    學習Linux應該從哪里開始?

    在工業控制、邊緣計算、人工智能這些領域,有一句幾乎約定俗成的話: “會不會 Linux,決定了你能走多遠。” 但對很多剛入門的工程師來說,Linux 看起來像個龐大又神秘的世界——命令行、驅動、內核
    的頭像 發表于 10-16 09:51 ?457次閱讀
    <b class='flag-5'>學習</b><b class='flag-5'>Linux</b>應該從哪里開始?

    【「Yocto項目實戰教程:高效定制嵌入式Linux系統」閱讀體驗】+基礎概念學習理解

    系統的基礎知識,及yocto的基礎知識。這部分內容對于我這樣有一定 Linux 基礎的讀者來說,起到了很好的復習和鞏固作用,同時也為后續學習 Yocto 項目奠定了堅實的理論基礎。 元數據 元數據架構
    發表于 08-04 22:29

    第六章 W55MH32 UDP?Multicast示例

    本文介紹了在W55MH32芯片上實現UDP組播的原理、應用場景及回環測試方法,并通過實戰代碼展示了其具體實現過程。下一篇文章將聚焦DNS例程,講解其工作原理及實現方法,幫助大家更深入地理解網絡通信。敬請期待!
    的頭像 發表于 07-24 09:19 ?1035次閱讀
    第六章 W55MH32 <b class='flag-5'>UDP</b>?Multicast示例

    第五章 W55MH32 UDP示例

    本文介紹了在 W55MH32?芯片上實現 UDP?通信及數據回環測試的方法。闡述了 UDP?協議的概念、特點、應用場景、報文傳輸流程和報文結構,展示了實現過程,借助網絡調試工具完成測試。
    的頭像 發表于 07-24 09:13 ?1108次閱讀
    第五章 W55MH32 <b class='flag-5'>UDP</b>示例

    樹莓派4 性能大比拼:標準Linux與實時Linux 4.19內核的延遲測試

    引言本文是對我之前關于RaspberryPi3同一主題的帖子的更新。與之前的帖子一樣,我使用的是隨Raspbian鏡像提供的標準內核,以及應用了RT補丁的相似內核版本。對于實時版,我
    的頭像 發表于 03-25 09:39 ?823次閱讀
    樹莓派4 性能大比拼:標準<b class='flag-5'>Linux</b>與實時<b class='flag-5'>Linux</b> 4.19內核的延遲測試

    IPC2221簡略學習筆記

    關于IPC2221的學習筆記。
    發表于 03-14 18:07 ?10次下載