亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

linux對(duì)于UDP的學(xué)習(xí)

 更新時(shí)間:2021年08月23日 17:05:52   作者:_YKitty  
本文將學(xué)習(xí)linux對(duì)于UDP的學(xué)習(xí),UDP(用戶數(shù)據(jù)報(bào)協(xié)議)沒有連接的,是面向數(shù)據(jù)報(bào)的,是不可靠,點(diǎn)進(jìn)來的小伙伴一起來學(xué)習(xí)吧

一、UDP、linux基礎(chǔ)介紹

套接字:就是IP地址+端口號(hào)

IP地址:4字節(jié)
端口號(hào):2字節(jié),也就是說范圍是0~65535
端口號(hào)分為:知名端口號(hào)、一些固定的端口號(hào)
知名端口號(hào)
0--1023:http,ssh,ftp,telnet等一些協(xié)議端口號(hào)都是固定的,對(duì)于操作系統(tǒng)來說是不能對(duì)其進(jìn)行分配的

一些固定的端口號(hào)

ssh服務(wù)器,使用22端口
ftp服務(wù)器,使用21端口
telnet服務(wù)器,使用23端口
http服務(wù)器,使用80端口
https服務(wù)器,使用443端口
操作系統(tǒng)動(dòng)態(tài)分配的端口號(hào)
客戶端服務(wù)器的端口號(hào),這個(gè)范圍的端口號(hào)操作系統(tǒng)可以對(duì)其進(jìn)行分配

查看端口號(hào)

less /etc/services
 //就可以查看Linux下所有的端口號(hào)了

IP地址的理解:
IP地址用來標(biāo)識(shí)一個(gè)主機(jī)

端口號(hào)的理解:
端口號(hào)就是用來告訴操作系統(tǒng)要對(duì)于那一個(gè)進(jìn)程進(jìn)行操作,也就是說端口號(hào)就是用來標(biāo)識(shí)一個(gè)進(jìn)程
一個(gè)端口號(hào)只可被一個(gè)進(jìn)程所占用,但是一個(gè)進(jìn)程可以擁有多個(gè)端口號(hào),也就是進(jìn)程和端口號(hào)是一對(duì)多的關(guān)系
當(dāng)我們寫一個(gè)程序使用端口號(hào)的時(shí)候,要避開這些知名端口號(hào)

【問題】

(1)一個(gè)進(jìn)程是否可以bind多個(gè)端口號(hào)呢?
可以,因?yàn)橐粋€(gè)進(jìn)程可以打開多個(gè)文件描述符,而每一個(gè)文件描述符都對(duì)應(yīng)著一個(gè)端口號(hào),所以一個(gè)進(jìn)程可以綁定多個(gè)端口號(hào)

(2)一個(gè)端口號(hào)是否可以被多個(gè)進(jìn)程bind?
不可以
如果一個(gè)進(jìn)程先綁定一個(gè)端口號(hào),然后再fork一個(gè)子進(jìn)程,這樣的話就實(shí)現(xiàn)了多個(gè)進(jìn)程綁定一個(gè)端口號(hào),但是不同的進(jìn)程綁定同一個(gè)端口號(hào)是不可以的
TIME_WAIT狀態(tài),服務(wù)器不能立即重啟也說明不用進(jìn)程不能同時(shí)綁定同一個(gè)端口號(hào)

(3)多個(gè)進(jìn)程可以監(jiān)聽同一個(gè)端口號(hào)嗎?
可以。監(jiān)聽之前要進(jìn)行創(chuàng)建套接字->綁定ip::端口號(hào)->監(jiān)聽。我們可以在bind之前使用setsockopt函數(shù),設(shè)置套接字選項(xiàng),其中就包括REUSEADDR這個(gè)選項(xiàng),表明多個(gè)進(jìn)程可以復(fù)用bind函數(shù)中指定的地址和端口號(hào)
所以套接字就可以準(zhǔn)確的標(biāo)識(shí)一臺(tái)主機(jī)上的一個(gè)進(jìn)程,從而完成計(jì)算機(jī)之間的通信(主機(jī)A的某個(gè)進(jìn)程與主機(jī)B上的另一個(gè)進(jìn)程進(jìn)行通信

 網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換:
對(duì)于數(shù)據(jù)在網(wǎng)絡(luò)中傳輸?shù)臅r(shí)候有著自己遵循的傳輸規(guī)則大端傳輸
對(duì)于主機(jī)上的數(shù)據(jù)的傳輸序列有著兩種:
大端:即高位字節(jié)序放在低地址上
小端:即低位字節(jié)序放在低地址上
傳輸:均是先傳輸?shù)偷刂飞系臄?shù)據(jù)然后是高地址上的數(shù)據(jù)
所以對(duì)于主機(jī)上的數(shù)據(jù)傳輸?shù)臅r(shí)候傳輸?shù)骄W(wǎng)絡(luò)上的時(shí)候有可能導(dǎo)致數(shù)據(jù)錯(cuò)誤(例如主機(jī)上是小端的時(shí)候,所以需要進(jìn)行轉(zhuǎn)換)

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

uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16 hostshort);
uint32_t ntohl(uint32_t netlong);
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é)議端格式

  • 16為UDP長(zhǎng)度,表示整個(gè)數(shù)據(jù)報(bào)(UDP首部+UDP數(shù)據(jù))的最大長(zhǎng)度(64KB)
  • 檢驗(yàn)和:如果校驗(yàn)和出錯(cuò),就會(huì)直接丟棄(檢驗(yàn)的是把首部和數(shù)據(jù)部分一起都檢驗(yàn))
  • 校驗(yàn)值首先在數(shù)據(jù)發(fā)送方通過特殊的算法計(jì)算得出,在傳遞到接收方之后,還要在重新計(jì)算。如果某個(gè)數(shù)據(jù)報(bào)在傳輸過程中被第三方篡改或者由于線路噪音等原因受到損壞,發(fā)送和接收方的校驗(yàn)計(jì)算值將不會(huì)相符,由此UDP協(xié)議可以檢驗(yàn)是否出錯(cuò)。
  • 源端口號(hào):在對(duì)方回信是選用,不需要時(shí)可用全0
  • 目的端口號(hào):在終點(diǎn)交付報(bào)時(shí)必須要用到
  • 長(zhǎng)度:UDP用戶數(shù)據(jù)報(bào)的長(zhǎng)度,其最小值是8(僅有首部)

UDP的特點(diǎn):

  • 無連接:直到對(duì)端的IP和端口號(hào)就直接進(jìn)行傳輸,不需要建立連接
  • 不可靠:沒有確認(rèn)機(jī)制,沒有重傳機(jī)制;因?yàn)闆]有網(wǎng)絡(luò)故障該段無法發(fā)送到對(duì)方,UDP協(xié)議層也不會(huì)給應(yīng)用層返回任何錯(cuò)誤信息
  • 面向數(shù)據(jù)報(bào):不能夠靈活的控制讀寫數(shù)據(jù)的次數(shù)和數(shù)量
  • 控制選項(xiàng)較少,數(shù)據(jù)傳輸過程中延遲小,數(shù)據(jù)傳輸效率高
  • 面向數(shù)據(jù)報(bào)
  • 應(yīng)用層交給UDP多長(zhǎng)的報(bào)文,UDP原樣發(fā)送,既不會(huì)拆分也不會(huì)合并

例:用UDP傳輸100個(gè)字節(jié)的數(shù)據(jù)
如果發(fā)送端調(diào)用一次sendto,發(fā)送100個(gè)字節(jié)。那么接收端也必須調(diào)用對(duì)應(yīng)的一次recvfrom,接收100字節(jié);而不能循環(huán)調(diào)用10次recvfrom,每次發(fā)送10個(gè)字節(jié)
UDP的緩存區(qū)
UDP沒有發(fā)送緩存區(qū),調(diào)用sendto之后會(huì)直接交給內(nèi)核,由內(nèi)核·將數(shù)據(jù)傳給網(wǎng)絡(luò)層協(xié)議進(jìn)行后續(xù)的傳輸動(dòng)作。因?yàn)閁DP是不面向連接的,所以沒有重發(fā)機(jī)制,也就不需要發(fā)送緩存區(qū)將已經(jīng)發(fā)送的數(shù)據(jù)保存下來為了發(fā)送失敗進(jìn)行重傳做準(zhǔn)備
UDP具有接收緩存區(qū)。但是這個(gè)接收緩存區(qū)不能保證收到的UDP報(bào)的順序和發(fā)送UDP報(bào)的順序一致;如果緩存區(qū)滿了,在到達(dá)的UDP數(shù)據(jù)就會(huì)被丟棄
UDP的Socket既能讀,也能寫,全雙工

UDP的使用注意事項(xiàng):
UDP協(xié)議首部中有一個(gè)16位的最大長(zhǎng)度,也就是說一個(gè)UDP能傳輸?shù)臄?shù)據(jù)的最大長(zhǎng)度是64K(包含UDP首部)。但是64K在當(dāng)今的互聯(lián)網(wǎng)環(huán)境下,是一個(gè)非常小的數(shù)字。如果我們需要傳輸?shù)臄?shù)據(jù)超過64K,就需要應(yīng)用層手動(dòng)的分包,多次發(fā)送,并在接收端拼裝
UDP首部中校驗(yàn)和的計(jì)算方法有些特殊。在計(jì)算校驗(yàn)和時(shí),要在UDP用戶數(shù)據(jù)報(bào)之前增加12個(gè)字節(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:簡(jiǎn)單文件傳輸文件協(xié)議
  • DHCP:動(dòng)態(tài)主機(jī)配置協(xié)議
  • DNS:域名解析協(xié)議

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

  • 參考TCP的可靠性機(jī)制,在應(yīng)用層實(shí)現(xiàn)類似的邏輯
  • 引用序列號(hào),保證數(shù)據(jù)順序
  • 引入確認(rèn)應(yīng)答,確保對(duì)端收到了數(shù)據(jù)
  • 引入超時(shí)重傳,如果隔一段時(shí)間沒有應(yīng)答,就重發(fā)數(shù)據(jù)

二、對(duì)于各函數(shù)使用

1、對(duì)于socket函數(shù)的使用

1.1 函數(shù)原型

int socket(int domain, int type, int protocol);
domain: 領(lǐng)域
    AF_INET:IPV4
    AF_INET6:IPV6
type: 類型
    SOCK_STREAM
    SOCK_DGARM
protocol: 協(xié)議

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

2、 對(duì)于bind函數(shù)的使用

2.1 函數(shù)原型
int bind(int socket, const struct sockaddr* address, socklen_t address_len);
2.2. 函數(shù)的作用
該函數(shù)采用先前創(chuàng)建好的套接字來對(duì)于IP地址以及端口號(hào)進(jìn)行綁定,也就是表示該套接字可以標(biāo)識(shí)出在一個(gè)網(wǎng)絡(luò)中一臺(tái)確定的主機(jī)并且主機(jī)中的進(jìn)程

3、 對(duì)于recvfrom函數(shù)的使用

3.1 函數(shù)原型

ssize_t recvfrom(int socket, void* restrict buffer, size_t length, 
                 int flags, struct sockaddr* restrict address, 
                socklen_t* restrict address_len);
​
socket:要接受那一個(gè)套接字的消息
buffer:用來接收消息的緩存區(qū)
length:接收的消息的長(zhǎng)度
flags:類型
address:空指針或者存儲(chǔ)發(fā)送信息的sockaddr結(jié)構(gòu)
addless_len:指定地址參數(shù)指向的sockaddr結(jié)構(gòu)的長(zhǎng)度

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

4、 對(duì)于sendto函數(shù)的使用

4.1 函數(shù)原型
ssize_t recvfrom(int socket, const void* message, size_t length,
                 int flags, const struct sockaddr* dest_addr,
                socklen_t* dest_len);
4.2 函數(shù)的作用
該函數(shù)是socket套接字從dest_addr出接收消息

三、 擴(kuò)展知識(shí)

1、 netstat

netstat是一個(gè)用來監(jiān)控TCP/IP網(wǎng)絡(luò)非重要工具
語(yǔ)法: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的程序的識(shí)別碼和名稱(PID/Program name)
-t,顯示TCP傳輸協(xié)議的連線狀況
-u,顯示UDP傳輸協(xié)議的連線狀況
-v,顯示指令執(zhí)行過程
-V,顯示版本信息
-x,顯示UNIX傳輸協(xié)議的連線狀況
-s,顯示網(wǎng)絡(luò)工作信息統(tǒng)計(jì)表
-h,在線幫助

2、 pidof

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

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

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

到此這篇關(guān)于linux對(duì)于UDP的學(xué)習(xí)的文章就介紹到這了,更多相關(guān)linux內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • linux中目錄與路徑常見相關(guān)命令

    linux中目錄與路徑常見相關(guān)命令

    在linux系統(tǒng)中操作文件,不像windows那么直觀,下面整理了一下Linux中的一些文件目錄與路徑的基本命令,需要的朋友參考下
    2017-04-04
  • 虛擬機(jī)中CentOS7設(shè)置固定IP地址的方法

    虛擬機(jī)中CentOS7設(shè)置固定IP地址的方法

    這篇文章主要介紹了虛擬機(jī)中CentOS7設(shè)置固定IP地址的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-12-12
  • linux 定時(shí)休眠的實(shí)現(xiàn)思路

    linux 定時(shí)休眠的實(shí)現(xiàn)思路

    這篇文章主要介紹了linux 定時(shí)休眠的實(shí)現(xiàn)思路,休眠的類型有三種類型,文章對(duì)每種類型介紹的都很詳細(xì),需要的朋友可以參考下
    2018-07-07
  • 教你如何修改Linux遠(yuǎn)程登錄歡迎提示信息

    教你如何修改Linux遠(yuǎn)程登錄歡迎提示信息

    教你如何在Linux中創(chuàng)建登錄歡迎提示信息,要登錄或登錄后的用戶顯示不同的警告或消息
    2018-03-03
  • 詳解Linux iptables常用防火墻規(guī)則

    詳解Linux iptables常用防火墻規(guī)則

    IPTABLES 是與最新的 3.5 版本 Linux 內(nèi)核集成的 IP 信息包過濾系統(tǒng)。這篇文章主要介紹了Linux iptables常用防火墻規(guī)則,需要的朋友可以參考下
    2019-07-07
  • Linux中nohup與&的用法和區(qū)別詳解

    Linux中nohup與&的用法和區(qū)別詳解

    這篇文章主要給大家介紹了關(guān)于Linux中nohup與&的用法和區(qū)別的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用Linux具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Centos7 利用LVM實(shí)現(xiàn)動(dòng)態(tài)擴(kuò)容的方法

    Centos7 利用LVM實(shí)現(xiàn)動(dòng)態(tài)擴(kuò)容的方法

    本篇文章主要介紹了Centos 7 利用LVM實(shí)現(xiàn)動(dòng)態(tài)擴(kuò)容的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-02-02
  • centos系統(tǒng)安裝Kubernetes集群步驟

    centos系統(tǒng)安裝Kubernetes集群步驟

    大家好,本篇文章主要講的是centos系統(tǒng)安裝Kubernetes集群步驟,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • CentOS6.9下NFS服務(wù)安裝配置教程

    CentOS6.9下NFS服務(wù)安裝配置教程

    這篇文章主要為大家詳細(xì)介紹了CentOS6.9下NFS服務(wù)安裝配置教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • Git fetch和pull的詳解及區(qū)別

    Git fetch和pull的詳解及區(qū)別

    這篇文章主要介紹了Git fetch和pull的詳解及區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2017-02-02

最新評(píng)論