[問題] 關於socket程式與TCP觀念

看板Programming作者 (好人超)時間15年前 (2010/04/09 10:27), 編輯推噓0(0012)
留言12則, 3人參與, 最新討論串1/1
※ [本文轉錄自 C_and_CPP 看板] 作者: james732 (好人超) 看板: C_and_CPP 標題: [問題] 關於socket程式與TCP觀念 時間: Fri Apr 9 04:53:29 2010 目前想要做一個測試: 當一個主機使用 listen, accept 等函式做為 TCP server 時 它同一個時間最多能建立幾個 TCP 連線呢?這個限制又是因為什麼? 對於不同的作業系統(ubuntu Linux, Windows)是否會有不同的表現? server 端程式碼:http://nopaste.csie.org/65edc 用無窮迴圈不斷的接受連線,什麼事都不做,停留在 ESTABLISHED 狀態 client 端程式碼:http://nopaste.csie.org/c0da0 用無窮迴圈不斷的 connect,同樣的什麼都不做,停留在 ESTABLISHED 狀態 目前發現有兩個因素會限制連線的上限 ulimit -n : 單一 process 能使用的 File descriptor 上限 sysctl -w net.ipv4.ip_local_port_range="1024 65000" : 能用的 local port 範圍 不過對於目前測試的結果,有些狀況不太明白 1. 使用 netstat -n 觀察,server 端的 port 一律是使用 53764 http://james545.myweb.hinet.net/1.jpg
其實我不太懂為什麼都是同一個 port 呢?這麼多的 client 可以用同一個? 2. 我是這麼執行程式的: server 端:./server 1234 ( server 監聽 TCP Port 1234 ) client 端:./client 1234 ( server 的 IP 寫死在程式裡, 連至 Port 1234 ) 不過 client 大約建立六萬的連線後,就會發生錯誤訊息 connect: Cannot assign requested address 判斷是 client 自己的 local port 用盡了,即使再開啟另一個 process 也相同 這個時候就必須要再用另外一部電腦來測試了 有沒有辦法解決這個問題呢? 3. 要像這樣測試 TCP 連線的上限,還有沒有其他的辦法呢? (譬如說現成的工具套件?) 4. 其實我一直不太能把 socket API 與 TCP/IP 的觀念很好的連結在一起 譬如說,我不懂 accept 與 connect 這兩個函式是怎麼搭配的 關於這個,有沒有比較好的參考資料呢? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.117.171.46 ※ 編輯: james732 來自: 140.117.171.46 (04/09 04:58)

04/09 05:39,
4. 如果是 accept 與 connect 這兩個函式的搭配, 建議你
04/09 05:39

04/09 05:39,
看 UNIX Network Programming, Volume 1
04/09 05:39

04/09 05:40,
如果是 socket API 與 TCP/IP 的觀念搭配, 建議你看
04/09 05:40

04/09 05:40,
TCP/IP Illustrated, Volume 2: The Implementation
04/09 05:40

04/09 05:41,
vol1 有唸過了 vol2 買了好久都還沒有看 orz
04/09 05:41

04/09 05:46,
2, 3 請參照 TCP UDP 的 header format
04/09 05:46

04/09 05:47,
因為在 TCP/IP 裡面, port 就是用 16-bit 來表示, 2^16 =
04/09 05:47

04/09 05:48,
65536, 我想這就是你問題的解答
04/09 05:48

04/09 09:39,
我知道2的原因是受限於port數量 只是不知道能不能更多XD
04/09 09:39
-- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.117.171.46

04/09 10:54, , 1F
上限看記憶體空間多少吧..
04/09 10:54, 1F

04/10 01:15, , 2F
每個tcp client 都要有一個local port
04/10 01:15, 2F

04/10 01:16, , 3F
所以理論上,本機端tcp client可以到65535
04/10 01:16, 3F

04/10 01:17, , 4F
而tcp server本來就是1個port,很多client
04/10 01:17, 4F

04/10 01:17, , 5F
連進來,不會占用到server端的其它port
04/10 01:17, 5F

04/10 01:18, , 6F
所以在server端, 理論上client是無限
04/10 01:18, 6F

04/10 01:19, , 7F
當然會受限於OS的"設定",以及程式的寫法
04/10 01:19, 7F

04/10 01:20, , 8F
bbs, bbs server的port是21, 我們是client
04/10 01:20, 8F

04/10 01:21, , 9F
所以你看ptt 一次都超過10萬人, 但 ptt
04/10 01:21, 9F

04/10 01:21, , 10F
server只會占用到1個port (21)
04/10 01:21, 10F

04/10 01:22, , 11F
有錯再請網友指正:)
04/10 01:22, 11F

04/10 03:43, , 12F
他不是已經只 listen 1234 ?
04/10 03:43, 12F
文章代碼(AID): #1Blf2O7N (Programming)
文章代碼(AID): #1Blf2O7N (Programming)