當前位置:首頁 » 編程語言 » phptcp連接

phptcp連接

發布時間: 2022-10-26 00:51:34

php-cgi.exe 通過TCP協議鏈接外部伺服器 求啥意思

php-cgi是個守護進程,和web伺服器通信的方式,例如:和nginx通信
如果是同一主機下,可以使用本地socket, 共享內存,消息隊列,管道等通信

Ⅱ PHP的tcp/ip怎麼與C語言的tcp/ip相互通信

包括對各種流數據的讀和寫:內存流、網路流或文件流。當然,通過NSStream也可以與伺服器進行通信。 無論是通過NSStream向伺服器寫數據,還是從NStream對象中讀取伺服器數據,都是一件簡單的事情。 在Mac OS X中,使用NSHost和NSStream與伺服器進行連接的代碼如下: NSInputStream *iStream; NSOutputStream *oStream; uint portNo = 500; NSURL *website = [NSURLURL

Ⅲ php中的tcp/ip連接

8192表示每次最多讀取8192個位元組的數據。

代碼的思路是沒問題的,細節的話沒有測試,不過你將服務端和客戶端都放在一個頁面里,不太合適。
至少你應該編寫兩個頁面分別來跑 socket_create 和 socket_connect

Ⅳ php中進行tcp連接,發指令

你需要先在命令行裡面 telnet 192.168.0.104 23 看看有沒有反應

Ⅳ php持久化連接和非持久化連接的區別

php紅連接mysql的 函數為mysql_connect() 和mysql_pconnect()

  • mysql_connect() 非持久化連接

  • mysql_pconnect() 持久化連接

兩者區別:

簡單的來說mysql_pconnect是用來在php與mysql間建立一條持續連接, 一般php的執行模式是腳本開始執行時初始化所有資源, 腳本運行結束後釋放所有資源. 而mysql_pconnect的方式則不這樣, mysql_connect每次都是重新通過tcp 或者unix domian socket跟sql伺服器建立關系, 每次握手都是要消耗不少伺服器資源的.


使用pconnect時, 有請求連接mysql時, php會檢查是否之前有條相同的連接(以相同的用戶名密碼連接到同一個mysql伺服器)已經建立, 如果有的話就直接使用這條連接。


mysql_connect與mysql_pconnect不會帶來功能的差異, 只有性能上的差別.

Ⅵ php-cgi.exe 通過TCP協議鏈接外部伺服器 求啥意思

可以通過socket 的一些方法連接TCP server, 用fstockopen() 函數連接 直接上例子: $host=10.50.75.20; $port = 4700;
$timeout = 30; // open a client connection try{ $fp

Ⅶ TCP協議總結

Transmission Control Protocol,傳輸控制協議,是一種面向連接的、可靠的、基於位元組流的傳輸層通信協議

TCP協議的目的是: 在不可靠傳輸的IP層之上建立一套可靠傳輸的機制。 TCP的可靠只是對於它自身來說的, 甚至是對於socket介面層, 兩個系統就不是可靠的了, 因為發送出去的數據, 沒有確保對方真正的讀到(所以要在業務層做重傳和確認機制)。

可靠傳輸的第一要素是 確認 , 第二要素是 重傳 , 第三要素是 順序 。 任何一個可靠傳輸的系統, 都必須包含這三個要素。 數據校驗 也是必要的。

傳輸是一個廣義的概念, 不局限於狹義的網路傳輸, 應該理解為通信和交互. 任何涉及到通信和交互的東西, 都可以借鑒TCP的思想。無論是在UDP上實現可靠傳輸或者創建自己的通信系統,無論這個系統是以API方式還是服務方式,只要是一個通信系統,就要考慮這三個要素。

SeqNum的增加是和傳輸的位元組數相關的。 上圖中,三次握手後,來了兩個Len:1440的包,而第二個包的SeqNum就成了1441。然後第一個ACK回的是1441(下一個待接收的位元組號),表示第一個1440收到了。

網路上的傳輸是沒有連接的,包括TCP也是一樣的 。而TCP所謂的「連接」,其實只不過是在通訊的雙方維護一個「連接狀態」,讓它看上去好像有連接一樣。所以,TCP的狀態變換是非常重要的。

查看各種狀態的數量
ss -ant | awk '{++s[$1]} END {for(k in s) print k,s[k]}'

通過三次握手完成連接的建立

三次握手的目的是交換通信雙方的初始化序號,以保證應用層接收到的數據不會亂序,所以叫SYN(Synchronize Sequence Numbers)。

ISN是不能hard code的,不然會出問題的。比如:如果連接建好後始終用1來做ISN,如果client發了30個segment過去,但是網路斷了,於是client重連,又用了1做ISN,但是之前連接的那些包到了,於是就被當成了新連接的包,此時,client的Sequence Number可能是3,而Server端認為client端的這個號是30了。全亂了。RFC793中說,ISN會和一個假的時鍾綁在一起,這個時鍾會在每4微秒對ISN做加一操作,直到超過232,又從0開始。這樣,一個ISN的周期大約是4.55個小時。因為,我們假設我們的TCP Segment在網路上的存活時間不會超過Maximum Segment Lifetime(MSL),所以,只要MSL的值小於4.55小時,那麼,我們就不會重用到ISN。

如果Server端接到了Clien發的SYN後回了SYN-ACK,之後Client掉線了,Server端沒有收到Client返回的ACK,那麼,這個連接就處於一個中間狀態,即沒成功,也沒失敗。於是,Server端如果在一定時間內沒有收到的ACK會重發SYN-ACK。在Linux下,默認重試次數為5次,重試的間隔時間從1s開始每次都翻番,5次的重試時間間隔為1s, 2s, 4s, 8s, 16s,總共31s,第5次發出後還要等32s都知道第5次也超時了,所以,總共需要 1s + 2s + 4s+ 8s+ 16s + 32s = 26 -1 = 63s,TCP才會斷開這個連接。

客戶端給伺服器發了一個SYN後,就下線了,於是伺服器需要默認等63s才會斷開連接,這樣,攻擊者就可以把伺服器的SYN連接的隊列耗盡,讓正常的連接請求不能處理。
於是,Linux下給了一個叫tcp_syncookies的參數來應對這個事:當SYN隊列滿了後,TCP會通過源地址埠、目標地址埠和時間戳打造出一個特別的Sequence Number發回去(又叫cookie),此時伺服器並沒有保留客戶端的SYN包。如果是攻擊者則不會有響應,如果是正常連接,則會把這個SYN Cookie發回來,然後服務端可以通過cookie建連接(即使你不在SYN隊列中)。
千萬別用tcp_syncookies來處理正常的大負載的連接的情況。因為sync cookies是妥協版的TCP協議,並不嚴謹。應該調整三個TCP參數:tcp_synack_retries減少重試次數,tcp_max_syn_backlog增大SYN連接數,tcp_abort_on_overflow處理不過來乾脆就直接拒絕連接

因為TCP是全雙工的,因此斷開連接需要4次揮手,發送方和接收方都需要發送Fin和Ack。如果兩邊同時斷連接,那就會就進入到CLOSING狀態,然後到達TIME_WAIT狀態。

指的是報文段的最大生存時間,如果報文段在網路中活動了MSL時間,還沒有被接收,那麼會被丟棄。關於MSL的大小,RFC 793協議中給出的建議是兩分鍾,不過實際上不同的操作系統可能有不同的設置,以Linux為例,通常是半分鍾,兩倍的MSL就是一分鍾,也就是60秒

主動關閉的一方會進入TIME_WAIT狀態,並且在此狀態停留兩倍的MSL時長。由於TIME_WAIT的存在,大量短連接會佔有大量的埠,造成無法新建連接。

主動關閉的一方發出 FIN包,被動關閉的一方響應ACK包,此時,被動關閉的一方就進入了CLOSE_WAIT狀態。如果一切正常,稍後被動關閉的一方也會發出FIN包,然後遷移到LAST_ACK狀態。

CLOSE_WAIT狀態在伺服器停留時間很短,如果你發現大量的 CLOSE_WAIT狀態,那麼就意味著被動關閉的一方沒有及時發出FIN包。

TCP要保證所有的數據包都可以到達,所以,必需要有重傳機制。

接收端給發送端的Ack確認只會確認最後一個連續的包 ,比如,發送端發了1,2,3,4,5一共五份數據,接收端收到了1,2,於是回ack 3,然後收到了4(注意此時3沒收到),此時的TCP會怎麼辦?我們要知道,因為正如前面所說的,SeqNum和Ack是以位元組數為單位,所以ack的時候,不能跳著確認,只能確認最大的連續收到的包,不然,發送端就以為之前的都收到了

但總體來說都不好。因為都在等timeout,timeout可能會很長

不以時間驅動,而以數據驅動重傳
如果包沒有連續到達,就ack最後那個可能被丟了的包,如果發送方連續收到3次相同的ack,就重傳

Selective Acknowledgment, 需要在TCP頭里加一個SACK的東西,ACK還是Fast Retransmit的ACK,SACK則是匯報收到的數據碎版,在發送端就可以根據回傳的SACK來知道哪些數據到了,哪些沒有收到

重復收到數據的問題,使用了SACK來告訴發送方有哪些數據被重復接收了

經典演算法:Karn/Partridge演算法,Jacobson/Karels演算法

TCP必需要知道網路實際的數據處理帶寬或是數據處理速度,這樣才不會引起網路擁塞,導致丟包

Advertised-Window :接收端告訴發送端自己還有多少緩沖區可以接收數據。於是發送端就可以根據這個接收端的處理能力來發送數據,而不會導致接收端處理不過來

接收端LastByteRead指向了TCP緩沖區中讀到的位置,NextByteExpected指向的地方是收到的連續包的最後一個位置,LastByteRcved指向的是收到的包的最後一個位置,我們可以看到中間有些數據還沒有到達,所以有數據空白區。

發送端的LastByteAcked指向了被接收端Ack過的位置(表示成功發送確認),LastByteSent表示發出去了,但還沒有收到成功確認的Ack,LastByteWritten指向的是上層應用正在寫的地方。

接收端在給發送端回ACK中會匯報自己的AdvertisedWindow = MaxRcvBuffer – LastByteRcvd – 1;

收到36的ack,並發出了46-51的位元組

如果Window變成0了,發送端就不發數據了

如果發送端不發數據了,接收方一會兒Window size 可用了,怎麼通知發送端呢:TCP使用了Zero Window Probe技術,縮寫為ZWP,也就是說,發送端在窗口變成0後,會發ZWP的包給接收方,讓接收方來ack他的Window尺寸,一般這個值會設置成3次,每次大約30-60秒。如果3次過後還是0的話,有的TCP實現就會發RST把鏈接斷了。

如果你的網路包可以塞滿MTU,那麼你可以用滿整個帶寬,如果不能,那麼你就會浪費帶寬。避免對小的window size做出響應,直到有足夠大的window size再響應。

如果這個問題是由Receiver端引起的,那麼就會使用David D Clark』s 方案。在receiver端,如果收到的數據導致window size小於某個值,可以直接ack(0)回sender,這樣就把window給關閉了,也阻止了sender再發數據過來,等到receiver端處理了一些數據後windows size大於等於了MSS,或者receiver buffer有一半為空,就可以把window打開讓send 發送數據過來。

如果這個問題是由Sender端引起的,那麼就會使用著名的 Nagle』s algorithm。這個演算法的思路也是延時處理,他有兩個主要的條件:1)要等到 Window Size >= MSS 或是 Data Size >= MSS,2)等待時間或是超時200ms,這兩個條件有一個滿足,他才會發數據,否則就是在攢數據。

TCP_CORK是禁止小包發送,而Nagle演算法沒有禁止小包發送,只是禁止了大量的小包發送

TCP不是一個自私的協議,當擁塞發生的時候,要做自我犧牲

擁塞控制的論文請參看 《Congestion Avoidance and Control》

主要演算法有:慢啟動,擁塞避免,擁塞發生,快速恢復,TCP New Reno,FACK演算法,TCP Vegas擁塞控制演算法

TCP網路協議及其思想的應用
TCP 的那些事兒(上)
TCP 的那些事兒(下)
tcp為什麼是三次握手,為什麼不是兩次或四次?
記一次TIME_WAIT網路故障
再敘TIME_WAIT
tcp_tw_recycle和tcp_timestamps導致connect失敗問題
tcp短連接TIME_WAIT問題解決方法大全(1)- 高屋建瓴
tcp短連接TIME_WAIT問題解決方法大全(2)- SO_LINGER
tcp短連接TIME_WAIT問題解決方法大全(3)- tcp_tw_recycle
tcp短連接TIME_WAIT問題解決方法大全(4)- tcp_tw_reuse
tcp短連接TIME_WAIT問題解決方法大全(5)- tcp_max_tw_buckets
TCP的TIME_WAIT快速回收與重用
淺談CLOSE_WAIT
又見CLOSE_WAIT
PHP升級導致系統負載過高問題分析
Coping with the TCP TIME-WAIT state on busy Linux servers

熱點內容
c語言編譯過程講解 發布:2025-01-06 05:52:42 瀏覽:693
安卓的光遇怎麼華麗退場 發布:2025-01-06 05:50:27 瀏覽:680
騰訊雲輕量伺服器設置獨立ip 發布:2025-01-06 05:50:26 瀏覽:722
伺服器的主機地址 發布:2025-01-06 05:47:38 瀏覽:869
為什麼安卓系統最近越來越多更新 發布:2025-01-06 05:47:30 瀏覽:956
如何用cmd打開伺服器管理器 發布:2025-01-06 05:44:40 瀏覽:436
我的世界國際服一進伺服器就崩 發布:2025-01-06 05:30:53 瀏覽:395
雲主機網站源碼 發布:2025-01-06 05:30:40 瀏覽:88
整數指數冪的運演算法則 發布:2025-01-06 05:22:32 瀏覽:362
php數據緩存技術 發布:2025-01-06 05:22:24 瀏覽:516