1. 程式人生 > >TCP打洞和UDP打洞的區別

TCP打洞和UDP打洞的區別

為什麼網上講到的P2P打洞基本上都是基於UDP協議的打洞?難道TCP不可能打洞?還是TCP打洞難於實現? 
    假設現在有內網客戶端A和內網客戶端B,有公網服務端S。 
    如果A和B想要進行UDP通訊,則必須穿透雙方的NAT路由。假設為NAT-A和NAT-B。 
    
    A傳送資料包到公網S,B傳送資料包到公網S,則S分別得到了A和B的公網IP, 
S也和A B 分別建立了會話,由S發到NAT-A的資料包會被NAT-A直接轉發給A, 
由S發到NAT-B的資料包會被NAT-B直接轉發給B,除了S發出的資料包之外的則會被丟棄。 
所以:現在A B 都能分別和S進行全雙工通訊了,但是A B之間還不能直接通訊。 

    解決辦法是:A向B的公網IP傳送一個數據包,則NAT-A能接收來自NAT-B的資料包 
並轉發給A了(即B現在能訪問A了);再由S命令B向A的公網IP傳送一個數據包,則 
NAT-B能接收來自NAT-A的資料包並轉發給B了(即A現在能訪問B了)。 

    以上就是“打洞”的原理。 

    但是TCP和UDP在打洞上卻有點不同。這是因為伯克利socket(標準socket規範)的 
API造成的。 
    UDP的socket允許多個socket繫結到同一個本地埠,而TCP的socket則不允許。
 
    這是這樣一個意思:A B要連線到S,肯定首先A B雙方都會在本地建立一個socket, 
去連線S上的socket。建立一個socket必然會繫結一個本地埠(就算應用程式裡面沒寫 
埠,實際上也是綁定了的,至少java確實如此),假設為8888,這樣A和B才分別建立了到 
S的通訊通道。接下來就需要打洞了,打洞則需要A和B分別傳送資料包到對方的公網IP。但是 
問題就在這裡:因為NAT裝置是根據埠號來確定session,如果是UDP的socket,A B可以 
分別再建立socket,然後將socket繫結到8888,這樣打洞就成功了。但是如果是TCP的 
socket,則不能再建立socket並繫結到8888了,這樣打洞就無法成功。

相關推薦

TCPUDP區別

為什麼網上講到的P2P打洞基本上都是基於UDP協議的打洞?難道TCP不可能打洞?還是TCP打洞難於實現?      假設現在有內網客戶端A和內網客戶端B,有公網服務端S。      如果A和B想要進行UDP通訊,則必須穿透雙方的NAT路由。假設為NAT-A和NAT-B。           A傳送資料包到公

TCPUDP區別

為什麼網上講到的P2P打洞基本上都是基於UDP協議的打洞?難道TCP不可能打洞?還是TCP打洞難於實現?     假設現在有內網客戶端A和內網客戶端B,有公網服務端S。     如果A和B想要進行UDP通訊,則必須穿透雙方的NAT路由。假設為NAT-A和NAT-B。    

TCP/IPUDP之間的區別(轉載)

有用 可靠性 client 之間 可靠的 col 因此 用戶數據報 ack 在分析兩者之間的區別之前,我們先搞清楚這兩者的關系, TCP/IP協議簇 是一種網絡控制協議,簡單點說就是一種網絡協議,我們網絡中的計算機就是通過這套協議簇來進行數據通信的。這套協議簇裏面包含了很

【轉】HTTP學習---TCPUDP協議的區別與應用

用戶數 prot 發送 smi 處理 層次 實時性 oot user 【原文】https://www.toutiao.com/i6592813624689951239/ 概述 ⊙TCP/IP是個協議組,可分為三個層次:網絡層、傳輸層和應用層。 在網絡層有IP協議、ICMP

TCPUDP協議的區別

TCP和UDP都是傳輸層的協議 UDP協議的特點: UDP協議是一種無連線的、不可靠的傳輸層協議(盡力而為的協議) 為什麼說UDP是一種無連線、不可靠的協議呢?UDP協議在傳輸報文之前不需要在

TCP/IP Http Https之間的區別

一直對TCP Http 和Socket稀裡糊塗的,今天專門的查了下: TCP/IP是個協議組,它分為網路層,傳輸層和應用層,  在網路層有IP協議、ICMP協議、ARP協議、RARP協議和BOOT

UDP心跳包設計

一、裝置終端class DeviceClient { int deviceID; int IP; int port; char connectID[16]; time_t lastTime; struct event timeoutEv;//超時器};typedef list<DeviceClient

NAT穿透(UDP

會有 work true icmp sea 類型判斷 無法 部分 什麽 1、NAT(Network Address Translator)介紹 NAT有兩大類,基本NAT和NAPT。 1.1、基本NAT 靜態NAT:一個公網IP對應一個內部IP,一對一轉換 動態NAT:N

Darwin Streaming Server 支援UDP

RTSP客戶端點播Darwin 視訊時,SDP協商後的客戶端埠可能是在NAT後面,所以需要Darwin支援NAT打洞的功能,從Darwin的原始碼看,官方的原始碼是不支援這個能力的。 通過抓取VLC客戶端的包發現,VLC在播放RTSP流時,兩次SETUP(音訊流和視訊分別協商埠)之後,

C#與python UDP通訊

本標題的應用場景是C#系統服務端和基於linux的python裝置在不同的區域網下通訊,通常C#系統端在辦公室內部wifi下,裝置在室外利用4G上網。 打洞原理網上蠻多的,隨便一搜就是好多,實際將如何打洞的確很少。這裡需要理論的推薦一篇部落格,個人覺得寫的很好。 https://blog.csd

【原創】IP攝像頭技術縱覽(七)---P2P技術—UDP實現內網NAT穿透

【原創】IP攝像頭技術縱覽(七)—P2P技術—UDP打洞實現內網NAT穿透 本文屬於《IP攝像頭技術縱覽》系列文章之一: Author: chad Mail: [email protected] 本文可以自由轉載,但轉載請務必註明

試驗UDP穿透NAT

目標 路由穿透,實現廣域網P2P通訊。 4種典型NAT型別 按照NAT裝置在進行地址對映時行為的不同,NAT可以分為以下四種:  Full Cone  Restricted Cone  Port Restricted Con

UDPNAT大致分為下面四類 P2P

NAT大致分為下面四類 1) Full Cone 這種NAT內部的機器A連線過外網機器C後,NAT會開啟一個埠.然後外網的任何發到這個開啟的埠的UDP資料報都可以到達A.不管是不是C發過來的. 例如 A:192.168.8.100 NAT:202.100.100.100

內網穿透&UDP

文章轉載自:http://www.cnblogs.com/cinlap/articles/2684330.html 這兩天找度度重新回憶了一下關於內網穿透的事情,在百度文庫上找到了兩三篇寫的比較通俗易懂的文章,把內網穿透做個簡單總結。 首先文章建議 Cone NA

NAT穿透技術詳解(udp精髓附程式碼)

以前自己寫的程式碼都只是在本地進行c/s通訊,今天想寫一個可以跨越外網的c/s通訊,這裡我就用udp實現一個點對點的不同外網的通訊。用到的技術就是nat穿透技術,這裡最直接使用的就是udp打洞技術。文中如有表述不清楚,歡迎提問。如果你需要nat穿透技術的詳解點這裡:nat穿透

golang實現p2p之UDP

當今網際網路到處存在著一些中介軟體(MIddleBoxes),如NAT和防火牆,導致兩個(不在同一內網)中的客戶端無法直接通訊。 這些問題即便是到了IPV6時代也會存在,因為即使不需要NAT,但還有其他中介軟體如防火牆阻擋了連結的建立。 目前部署的中介軟體多都是在C/

NAT穿透,UDP程式

在看NAT穿透和UDP打洞原理,網上都是講原理,沒有程式,我把程式寫出來。 server.py,輔助打洞的伺服器。 peer.server.py,被打洞的節點。 peer.client.py,主動打洞的節點。 基本原理是: 1. peer.client向peer.serve

Python實現簡單的udp(P2P)

UDP穿越NAT的具體設計    首先,Client A登入伺服器,NAT 1為這次的Session分配了一個埠60000,那麼Server S收到的Client A的地址是200.0.0.132:60000,這就是ClientA的外網地址了。同樣,Client

簡單的p2p-demo,udp

什麼是p2p: peer-to-peer,簡單來說,就是兩個使用者可以直接進行網路通訊。 為什麼我們需要p2p: 1.大多數的網路狀態都是使用者A和使用者B互相通訊,需要一箇中間伺服器來做訊息的中轉。如果可以使用者對使用者直接通訊,那麼可以減輕伺服器壓力。 2.一定程度上

javaWar包,war包jar包的區別

module app clas 完全 doc rip 折扣 通用 enter 以最終客戶的角度來看,JAR文件就是一種封裝,他們不需要知道jar文件中有多少個.class文件,每個文件中的功能與作用,同樣可以得到他們希望的結果。除jar以外對於J2EE來說還有war和ear