tcp :
綁定一個 socket 只是用來監聽,accept 對每個客戶端生成一個 socket 用來維護滑動窗口等。每個客戶端用一個 socket 用來維護滑動窗口等。
4 次揮手對應兩次 close 的 fin 和返回的 ack。
而三次揮手在 connect 里阻塞完成。
?udp :
雙方各建一個 socket,收到對方信息時,也收到對方 ip,后面用自己的 socket 往 ip 發送就行。
通用:read write 系統io讀寫,可以讀寫任何文件fd #include<unistd.h>
tcp:recv send #include<sys/socket.h>
udp:recvfrom sendto #include<sys/socket.h>
udp的recvfrom接收到數據后要即使從緩沖區拿出數據,不然緩沖區滿了,會覆蓋之前的數據。
sendto發送時不存在發送部分字節,因為它時數據報形式,會把用戶的數據全部裝入一個udp數據報一起發送,要么成功要么失敗。無論每次發送多少,每個 sendto 調用會嘗試將整個數據報作為一個不可分割的單元發送,具有原子性,所以只有成功和失敗。若無法發送(如緩沖區不足、報文過大,沒有網絡等),sendto 返回 -1。因此加上包頭盡量不超過1個MTU大小,大部分以太網MTU為1500字節。
tcp的發送是流式的它有滑動窗口,它的send每次調用只負責將數據拷貝到內核。它的返回是拷貝到內核的字節大小。因此如果一次沒有發送完成,需要用戶手動調整待發送緩沖區的指針位置,直到發送完畢。(多次send拷貝到內核后,可能只對應著一次網絡發送,因此控制發送大小的是滑動窗口。)
tcp的接收,因為tcp是流式的,它有滑動窗口限制,當緩沖區快滿時,會通知阻止發送方的發送行為,因此不會出現覆蓋數據,介個就叫可靠傳輸阿。
無論時udp還是tcp,他們的接收默認都是阻塞的,但可設置非阻塞。
?