• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            woaidongmao

            文章均收錄自他人博客,但不喜標題前加-[轉(zhuǎn)貼],因其丑陋,見諒!~
            隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
            數(shù)據(jù)加載中……

            FastCGI協(xié)議報文的分析

            http://xiaoxia.org/?p=1891

            不知道什么時候,就開始有了讓HomeServer支持PHP的念頭。于是分析起了FastCGI協(xié)議。FastCGI用于WebServerWebApplication之間的通訊,例如ApachePHP程序。

            FastCGI協(xié)議數(shù)據(jù)包是8字節(jié)對齊的,由包頭(Header)和包體(Body)組成。例如要請求一個index.php的頁面,WebServer首先向WebApp發(fā)送一個Request數(shù)據(jù)包。包頭有個請求ID用于并行工作時,區(qū)別不同的請求。

            包頭

            [
            版本:1][類型:1][請求ID:2][數(shù)據(jù)長度:2][填充字節(jié)數(shù):1][保留:1]

            包體

            [
            角色:2][參數(shù):1][保留:5]

            接著,再發(fā)送一個Params數(shù)據(jù)包,用于傳遞執(zhí)行頁面所需要的參數(shù)和環(huán)境變量。

            包頭

            [
            版本:1][類型:1][請求ID:2][數(shù)據(jù)長度:2][填充字節(jié)數(shù):1][保留:1]

            包體

            [
            名稱長度:14][值長度:14][名稱:變長][:變長] ...

            其中,名稱和值的長度占用的字節(jié)數(shù)是可變,取決于第一個字節(jié)(高位)的最高位是否為1,為1則長度是4個字節(jié),否則為1個字節(jié)。即如果長度不超過128字節(jié),就用一個字節(jié)來保存長度足夠了。

            參數(shù)發(fā)送后還要發(fā)送一個沒有包體,只有包頭的空的Params數(shù)據(jù)包,用來表示參數(shù)發(fā)送結(jié)束。

            如果請求頁面時POST方式,還會發(fā)送表單數(shù)據(jù)。這就要用到Stdin數(shù)據(jù)包了。

            包頭

            [
            版本:1][類型:1][請求ID:2][數(shù)據(jù)長度:2][填充字節(jié)數(shù):1][保留:1]

            包體

            [
            數(shù)據(jù)內(nèi)容:長度在包頭中設(shè)置,8字節(jié)對齊]

            有時候POST的數(shù)據(jù)大于或等于64KB,就不能使用一個Stdin數(shù)據(jù)包發(fā)送完畢了,需要使用多次Stdin數(shù)據(jù)包來完成所有數(shù)據(jù)的傳輸。與Params數(shù)據(jù)包一樣,結(jié)尾要發(fā)送一個沒有包體,只有包頭的空的Stdin數(shù)據(jù)包,用來表示參數(shù)發(fā)送結(jié)束。

            至此,WebServer要提供給WebApplication的數(shù)據(jù)已經(jīng)發(fā)送完畢。接著就接收來自WebApplication的數(shù)據(jù)了。

            數(shù)據(jù)接收包StdoutStdin是差不多的,這里不再描述。不過接收到的數(shù)據(jù)由HTTP頭和網(wǎng)頁數(shù)據(jù)兩部分組成,WebServer要對其做一定的處理后才能發(fā)送到瀏覽器。同Stdin數(shù)據(jù)包一樣,WebServer會接收到一個來自WebApplicationStdout的空數(shù)據(jù)包,表示接收的Stdout數(shù)據(jù)已經(jīng)完畢。

            最后,WebApplication會發(fā)送一個包含狀態(tài)的EndRequest數(shù)據(jù)包,至此,一次頁面請求處理完畢。

            下面給出一些相關(guān)結(jié)構(gòu)參考。

            通用包頭:

            typedef struct {
                unsigned char version;
                unsigned char type;
                unsigned char requestIdB1;
                unsigned char requestIdB0;
                unsigned char contentLengthB1;
                unsigned char contentLengthB0;
                unsigned char paddingLength;
                unsigned char reserved;
            }FCGI_Header;
             
            typedef struct {
                unsigned char roleB1;
                unsigned char roleB0;
                unsigned char flags;
                unsigned char reserved[5];
            } FCGI_BeginRequestBody;
             
            typedef struct {
                FCGI_Header header;
                FCGI_BeginRequestBody body;
            } FCGI_BeginRequestRecord;
             
            typedef struct {
                unsigned char appStatusB3;
                unsigned char appStatusB2;
                unsigned char appStatusB1;
                unsigned char appStatusB0;
                unsigned char protocolStatus;
                unsigned char reserved[3];
            } FCGI_EndRequestBody;

            每次請求頁面時,傳遞給PHP程序的參數(shù):

            SCRIPT_FILENAME,

            QUERY_STRING,

            REQUEST_METHOD,

            CONTENT_TYPE,

            CONTENT_LENGTH,

            SCRIPT_NAME,

            REQUEST_URI,

            DOCUMENT_URI,

            DOCUMENT_ROOT,

            SERVER_PROTOCOL,

            GATEWAY_INTERFACE,

            SERVER_SOFTWARE,

            REMOTE_ADDR,

            REMOTE_PORT,

            SERVER_ADDR,

            SERVER_PORT,

            SERVER_NAME,

            REDIRECT_STATUS,

            HTTP_ACCEPT,

            HTTP_ACCEPT_LANGUAGE,

            HTTP_ACCEPT_ENCODING,

            HTTP_USER_AGENT,

            HTTP_HOST,

            HTTP_CONNECTION,

            HTTP_CONTENT_TYPE,

            HTTP_CONTENT_LENGTH,

            HTTP_CACHE_CONTROL,

            HTTP_COOKIE,

            HTTP_FCGI_PARAMS_MAX

            好像很多,但是很多空值的,可以省去,不發(fā)送之,即可。

            參考文獻:

            FastCGI Specification

            感謝狙擊手同志提供相關(guān)幫助。

             

            posted on 2011-06-21 11:30 肥仔 閱讀(1462) 評論(0)  編輯 收藏 引用 所屬分類: Web-后臺

            久久99精品国产麻豆宅宅| 中文字幕精品无码久久久久久3D日动漫| 久久久久久曰本AV免费免费| 伊人久久精品无码av一区 | 久久精品无码专区免费| 国产色综合久久无码有码| 国产精品禁18久久久夂久| 亚洲AV伊人久久青青草原| 精品久久久久久久久中文字幕| 无码乱码观看精品久久| 97久久久久人妻精品专区 | 国内精品久久久久影院一蜜桃| 久久久99精品成人片中文字幕 | 久久噜噜久久久精品66| 国产精品久久久久久影院| 久久亚洲中文字幕精品一区| 国产午夜精品理论片久久| 久久久女人与动物群交毛片 | 亚洲欧美久久久久9999 | 日韩久久久久中文字幕人妻 | 99久久99久久精品国产片| 久久香蕉国产线看观看精品yw | 国内精品久久久久| 日韩AV无码久久一区二区 | 国产国产成人久久精品| 久久成人精品视频| 精品一区二区久久久久久久网站| 亚洲欧美成人综合久久久| 久久人妻少妇嫩草AV蜜桃| 日韩精品久久久久久久电影| 欧美无乱码久久久免费午夜一区二区三区中文字幕 | 精品精品国产自在久久高清| 久久天堂AV综合合色蜜桃网| 久久精品久久久久观看99水蜜桃 | 国产一区二区精品久久岳| 久久精品一区二区影院| 久久久久亚洲精品男人的天堂| 国产精品久久久99| 久久久久久午夜精品| 亚洲精品高清国产一线久久| 国产成人久久精品一区二区三区 |