網路程式設計小知識

2022-05-22 09:42:12 字數 2615 閱讀 8944

pdu  

協議資料單元,有隱藏size上限,如果應用程式的包超過指定上限會被劃分為多個pdu傳送

tcp不提供記錄結束標記,需要應用程式自己提供,比如http的\r\n

編寫tcp協議需要注意ipv4和ipv6的相容性,可以在應用程式中實現協議無關性。

getaddrinfo

多執行緒的socket程式設計不能依賴於標準的errno變數,在多執行緒中,error通過返回值而不是errno的方式通知呼叫者。

出於網路安全的考慮,應當使用strncpy、strncat、snprintf替代無緩衝區檢查的字串函式,避免黑客的字串溢位攻擊。

sockaddr和sockaddr_in在傳給函式做引數的時候必須強轉指標型別,是因為早期的套接字介面產生時還沒有void*指標。

對廣播位址執行ping命令,可以獲取子網中所有ip資訊

繞過tcp和udp,直接使用ipv4和ipv6,被稱為原始套介面程式設計

ping使用icmp協議,icmp是tcp的補充協議,也是一種傳輸層協議。

tcpdump使用dlpi(資料鏈路層介面)或者bpf(bsd分組過濾器,提供訪問資料鏈路層介面)協議,使用資料鏈路層協議。

乙個udp套接字是由乙個二元組來標識的,具備不同的源ip和源埠,但具有相同的目的ip和目的埠號的資料報將通過相同的套接字被定向到同乙個目的程序。

乙個tcp套接字是由乙個四元組標識的,具備不同的源ip和源埠,但具有相同的目的ip和目的埠號的資料報將被定位到不同的套接字。

udp是一種無連線的協議,因為udp的客戶端和伺服器無需維持長久的關係,乙個客戶端可以使用乙個套接字向不同的伺服器傳送訊息,乙個服務端也可以使用同乙個套接字接收來自不同客戶端的訊息。

tcp估算客戶端到伺服器往返花費時間rtt的演算法是動態的,因為隨著負載的不同,往返花費時間是動態變化的。

關閉連線的fin訊息除了關閉單向連線還具有結束檔案的作用,收到fin的端會把fin作為檔案結束符傳遞給接收應用程序(放在已排隊等待接收的任何資料之後)。表示應用程式在連線上再也接收不到額外資料,但tcp還是可以接收訊息的,想想後面的ack訊息是怎麼接收的。

tcp是沒有訊息邊界的,udp具有長度,可以認為每個udp資料報都是一條訊息。

大多數情況下是客戶端主動關閉連線,而http協議是服務端主動關閉連線。

tcp連線有11種狀態,使用netstat可以顯示所有這些狀態。

time_wait狀態的時間是msl(最常分節生命期)的兩倍,有時稱為2msl,msl是ip資料報在網際網路中能生存的最長時間。rfc1122建議msl是2分鐘,而berkeley的實現傳統上是30s。

存在time_wait狀態的理由:

1。實現終止tcp全雙工連線的可靠性,(假設主動關閉的一端是客戶端,被動關閉的一端是服務端)假設最終的ack丟失,服務端將重發最終的fin,必須維持狀態以便重發最終的ack。如果不維護狀態,客戶端將響應以rst分節,這個分節被認為是某種錯誤。time_wait存在的目的是為了解決關閉連線的任何乙個分節可能丟失的狀況。

2.允許老的重複分節在網路中消逝,假設乙個連線在關閉後又以相同的ip和埠號建立新的連線,必須要保證老的連線的重複分組在網路中已經消失,避免被認為是新的連線的分組。為了做到這點,tcp不能給出於time_wait階段的連線建立新的化身連線(指以一樣的ip和埠建立連線)。

unix系統有保留埠的概念,任何小於1024的埠都只能分配給超級使用者程序的套介面。即周知埠的啟動必須有超級使用者許可權。

tcp有乙個mss,通告對方在每個分節中可以傳送的最大tcp位元組量,避免在經過路由的時候被分片。

tcp的傳送是非同步的,write返回僅僅表示資料拷貝到了傳送緩衝區,並不代表對端收到了訊息。

位元組流套接字上的read和write的表現不同於通常的檔案i/o,位元組流套接字上read和write實際讀取和寫入的位元組可能比要求的少,這可能是套接字的緩衝區達到了極限,而不是錯誤,此時需要做的是再次呼叫read和write。

rst表示指定的對端的埠沒有程序在等待連線。

connect失敗時,套接字不再可用,該套接字必須被關閉,不能再次connect該套接字,再次連線需要關閉該套接字,重新呼叫socket。

connect函式呼叫前不一定非得呼叫bind,如果有必要,核心將分配乙個臨時埠,server一般會呼叫bind,因為要繫結乙個周知埠供客戶端連線。

當有客戶端傳送syn時,伺服器首先在未完成連線佇列建立條目,如果三次握手完成,把該條目從未完成佇列轉移到已完成佇列的隊尾。當呼叫accept的時候,從已完成佇列的隊首返回乙個連線(三次握手在accept之前已經完成,accept是從已建立連線的佇列中取出隊首)。

listen函式只做兩件事

1.使用socket建立乙個套接字時,核心預設是主動套接字,將呼叫connect發起連線的客戶端套接字,而listen將未連線的套接字轉換為被動套接字,等待其他socket的連線請求。同時tcp的狀態closed狀態轉換到listen。

2.設定核心為此套介面排隊的最大連線數。

tcp套接字的close介面給socket打上已關閉的標記,應用程序不能在此套接字上read和write,tcp會嘗試傳送已排隊的所有資料,然後按照正常的序列關閉tcp連線。

獲取與套介面關聯的本地協議位址getsockname,getsockname也可以對未繫結的套接字使用,獲取與套介面關聯的遠端協議位址getpeername,知道客戶協議位址的另乙個方法是accept。

python網路程式設計小知識點

import requests url req requests.post url username fei password 12 print req.text 這裡返回的是字串 import requests url data req requests.post url,data print r...

網路小知識

ip網路的劃分 ip位址是用來標識網路中的乙個通訊實體,比如一台主機,或者是路由器的某乙個埠。而在基於ip協議網路中傳輸的資料報,也都必須使用ip位址來進行標識,如同我們寫一封信,要標明收信人的通訊位址和發信人的位址,郵政工作人員通過該位址來決定郵件的去向。在計算機網路裡,每個被傳輸的資料報也要包括...

Linux網路設定小知識

檢視所有活動的網路介面資訊 執行ifconfig命令 檢視指定網路介面資訊 設定網路介面引數ifconfig ifconfig 網路介面 ip位址 netmask 子網掩碼 ifconfig 網路介面 ip位址 子網掩碼長度 禁用或者重新啟用網絡卡 ifconfig 網路介面 up ifconfig...