在編寫TCP程序的時(shí)候,對(duì)于服務(wù)端,accept成功返回的時(shí)候,就一定意味著某個(gè)客戶端已經(jīng)成功建立了TCP連接嗎?對(duì)于客戶端,connect成功返回就一定意味著自己成功連接上服務(wù)端了么?遠(yuǎn)遠(yuǎn)不是!
accept/connect這兩個(gè)socket調(diào)用完全是基于TCP三次握手狀態(tài)機(jī)的,即只要本地TCP狀態(tài)機(jī)進(jìn)入ESTABLISH狀態(tài),就會(huì)成功返
回。而我們知道,TCP的三次握手本身就是一次權(quán)衡的結(jié)果。為什么不是四次握手呢?為什么不是五次呢?...問題可以一直這么問下去。
事實(shí)上,客戶端完全可以在收到syn-ack之后,發(fā)送最后一個(gè)ack之后不辭而別,服務(wù)端也可以在收到syn之后,發(fā)送syn-ack之后不辭而別,從
此再也不問世事,對(duì)于對(duì)端而言,accept/connect顯然會(huì)成功返回,因?yàn)閷?duì)端的狀態(tài)機(jī)已經(jīng)轉(zhuǎn)換到了ESTABLISH,它們無法意識(shí)到自己被耍
弄了。對(duì)于TCP而言,它作為一個(gè)基于連接的端到端協(xié)議,和我們的工作很類似,入職的時(shí)候,要簽訂合同,離職的時(shí)候,要辦理離職手續(xù),對(duì)于不辭而別者,你
能做的大多數(shù)只能是嘲諷。可是對(duì)于TCP而言,卻可以用上述這種不辭而別手段來提高自己的“每秒新建連接數(shù)”用來欺騙比較低級(jí)的測(cè)試工具,或者嘲弄那些知
其然不知其所以然的應(yīng)聘者(作為一塊有效的試金石,有時(shí)真的要問那些應(yīng)聘者一些這類問題,它們要比讓應(yīng)聘者寫個(gè)握手過程,寫個(gè)socket程序,解釋一下
socket函數(shù)的參數(shù)要有效的多)。
對(duì)于上述的不辭而別,欺騙客戶端要比欺騙服務(wù)端更加容易,因?yàn)閷?duì)于服務(wù)端而言,存在一個(gè)socket
option,叫做TCP_DEFER_ACCEPT,它在收到客戶端的第一筆數(shù)據(jù)之前,抑制accept的返回,當(dāng)然,它僅僅針對(duì)客戶端首先發(fā)送第一筆
數(shù)據(jù)的應(yīng)用層協(xié)議(比如HTTP協(xié)議)有效。
如果是我在考察應(yīng)聘者對(duì)TCP編程的理解,我會(huì)讓他們寫一個(gè)或者理解一個(gè)全程的欺騙程序,將TCP的連接ack機(jī)制轉(zhuǎn)換為挑戰(zhàn)/應(yīng)答模式:
欺
騙客戶端:編寫一個(gè)欺騙服務(wù)端,持續(xù)執(zhí)行且僅僅執(zhí)行下面的邏輯:1.只要收到syn,就計(jì)算一個(gè)初始序列號(hào),構(gòu)造并回復(fù)syn-ack;2.只要收到數(shù)
據(jù),就基于這段數(shù)據(jù)的TCP頭信息構(gòu)造純ack包回應(yīng)之;3.只要收到fin,自己就ack掉它,然后也發(fā)一個(gè)fin;4.自己決不主動(dòng)發(fā)起任何數(shù)據(jù)。
欺騙服務(wù)端:這個(gè)也不難...
至
于如何拿到TCP數(shù)據(jù)而不是讓其進(jìn)入?yún)f(xié)議棧,這在實(shí)現(xiàn)上是重要的,可以考察應(yīng)聘者對(duì)系統(tǒng)的熟悉程度。為何不能進(jìn)入?yún)f(xié)議棧呢?因?yàn)檫M(jìn)入?yún)f(xié)議棧就將進(jìn)入標(biāo)準(zhǔn)的
正確的處理流程,一般會(huì)被RST...那么如何拿到數(shù)據(jù)呢?辦法太多了,包括但不限于:1.使用PACKET套接字;2.使用PF_RING;3.使用
TUN/TAP網(wǎng)卡;4.使用Netfilter queue機(jī)制;5.直接改內(nèi)核...
以上的那些工作真的有意義嗎?常規(guī)地講,沒有任何意義,即便你通過這種方式使自己的服務(wù)器達(dá)到了超極高的并發(fā),一旦被發(fā)現(xiàn),估計(jì)就不僅僅是技術(shù)范疇的問題
的。事實(shí)上,做上面的事的意義在于,至此你將明白什么是“一個(gè)TCP連接”,確切地說,一個(gè)TCP連接包括兩個(gè)無誤的狀態(tài)機(jī),而不僅僅是一個(gè),一個(gè)TCP
連接在概念上和網(wǎng)絡(luò)沒有任何關(guān)系,是以為“端到端協(xié)議”,對(duì)于上述的行為,顯然在不辭而別或者挑戰(zhàn)應(yīng)答的那一端沒有維護(hù)一個(gè)無誤的狀態(tài)機(jī),所以就不是一個(gè)
完整無誤的TCP連接,基于TCP連接的性能測(cè)試比如新建TCP連接數(shù)測(cè)試就必須可以檢測(cè)到這種情況。所以說,這種測(cè)試必須包含業(yè)務(wù)范疇的挑戰(zhàn)/應(yīng)答數(shù)據(jù)
的傳輸,即,再次重申:你可以telnet成功某個(gè)IP的某個(gè)端口,并不意味著一定有某個(gè)服務(wù)在為你開啟。換句話說,只要能拿到數(shù)據(jù)包,怎么處理就是自己
的事了,如果在對(duì)端看來你看起來像個(gè)正常的協(xié)議棧,你就可以欺騙他們了,處在兩地的兩個(gè)端作為一個(gè)整體缺乏一種集體自省機(jī)制...
缺乏自省機(jī)制是必然的,因?yàn)橐坏┯辛俗允C(jī)制,那么網(wǎng)絡(luò)就真的變成了智能生物...計(jì)算機(jī)擁有處理任意復(fù)雜數(shù)據(jù)的能力,遺憾的是,它自己并不知道自己有這
種能力。深入思考這個(gè)問題是有意思的,我知道我姓趙,但是我自己知道“我我知道我姓趙”這件事嗎?“我最害怕天黑”和“我承認(rèn)我最害怕天黑”是完全不同
的。
創(chuàng)新互聯(lián)建站是專業(yè)的蓮池網(wǎng)站建設(shè)公司,蓮池接單;提供網(wǎng)站設(shè)計(jì)制作、做網(wǎng)站,網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行蓮池網(wǎng)站開發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!