学习《apache源代码全景分析》之网络连接部分摘录
1.MPM框架負責多進程或多線程的并發處理,它偵聽指定的套接字,一旦客戶端請求到來,它將立即接受該請求,并創建相應的連接。而一旦連接建立完畢,核心將從該連接上讀取請求的數據。
??
整個HTTP連接處理的過程可以分為下面幾大部分:
? ?(1) 接收連接
? ?(2) 創建連接
? ?(3) 連接預處理
? ?(4) 請求處理
? ?(5) 清除連接和關閉連接
2.等待連接的過程就是調用套接字函數listen的過程。Apache中使用封裝后的APR函數ap_setup_listeners進行偵聽。對于MPM來說,該函數在掛鉤open_logs被調用的時候觸發。
3.Apache核心將創建一個conn_rec結構,連接的創建通過create_connection掛鉤完成。
struct conn_rec {apr_pool_t *pool;server_rec *base_server;void *vhost_lookup_data;apr_sockaddr_t *local_addr;apr_sockaddr_t *remote_addr;char *remote_ip;char *remote_host;char *remote_logname;char *local_ip;char *local_host;ap_conn_keepalive_e keepalive;signed int double_reverse:2;int keepalives;unsigned aborted:1;long id;struct ap_conf_vector_t *conn_config;apr_table_t *notes;struct ap_filter_t *input_filters;struct ap_filter_t *output_filters;void *sbh;struct apr_bucket_alloc_t *bucket_alloc;conn_state_t *cs;int data_in_input_filters;int clogging_input_filters; };4.套接字綁定和偵聽流程:
? ?
? ?open_listeners內部的主要工作包括三部分:
? ? ?(1) 對于每一個套接字,調用make_sock函數,將其與給定的IP地址/端口綁定在一起,同時在指定的端口上進行偵聽。
? ? ?(2) 如果本次是重新啟動,那么啟動前的偵聽套接字都保存在old_listeners中,這些偵聽套接字都不再需要了,此時必須將它們逐一關閉;
? ? ?(3) 注冊偵聽套接字內存池清理函數。
?
? ? ?conn_rec中的notes字段的作用:它通常類似于一個中介傳輸者,在不同的模塊和不同的函數之間傳遞一個信息。通常情況下某個函數將須要傳遞其余函數的信息設置在notes中,其余的函數則相應從中獲取,類似于一個傳送帶,如下圖:
? ? ?
? ? ?一旦建成conn_rec結構,MPM模塊將會調用ap_process_connection()對該連接進行進一步處理。ap_process_connection()是整個Apache的核心部分,至此,Apache將脫離MPM模塊的控制,進入請求-響應循環。
? ??
? (1) 使用ap_update_vhost_given_ip()函數確定該連接IP地址所對應的所有虛擬主機;
? (2) 調用pre_connection掛鉤。
? (3) 調用process_connection掛鉤處理該連接。
5.pre_connection階段的一項重要任務就是在過濾器堆棧中插入新的連接過濾器。
? ? 目前Apache中實現該掛鉤的模塊包括: core、ssl模塊、nw_ssl、logio模塊、dumpio模塊
? ? 總而言之,在處理連接之前需要做的任何與連接相關的準備工作都可以放到pre_connection中去處理。
6.HTTP連接處理的主要內容包括兩方面:讀取連接上的請求數據及處理這些請求數據。Apache中通過ap_read_request函數完成一次請求讀取,而請求的處理則由函數ap_process_request完成。
7.一個HTTP請求連接通常會對應多個request_rec結構
? ??
8.請求讀取實現
? ?
? ?請求讀取流程:
? ?
9.HTTP/1.1 協議規定(RFC2616 14.23節),瀏覽器必須發送host請求頭,因此,當發現協議為1.1.版本時,同時卻沒有告知完整的URL或沒有在請求行中請求host域,這種情況是不允許的,此時將直接發送錯誤響應,返回錯誤碼為400.
10.如果服務器收到的頭信息存在Expect域,同時值為100-continue的請求,這是指客戶端詢問是否可以在后續的請求中發送附件。在這種情況下,服務器用100(SC_CONTINUE)允許客戶端繼續或用417(Expectation Failed)告訴客戶端不同意接受附件。這個狀態碼是HTTP 1.1中新加入的。如果存在非空的Expect頭域,同時值為"100-continue",則將請求的expecting_100設置為1,這樣返回給客戶端,允許繼續發送附件。如果請求頭域的值無法識別,那么進行出錯處理,發送響應,記錄日志。
11.請求頭的讀取使用ap_get_mime_headers_core實現。
12.實際報文的逐行讀取是通過函數ap_rgetline完成的,該函數的內部調用了ap_rgetline_core函數。ap_rgetline_core函數完成實際的IO讀取工作。
?
?
總結
以上是生活随笔為你收集整理的学习《apache源代码全景分析》之网络连接部分摘录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学习《apache源代码全景分析》之多任
- 下一篇: 学习《apache源代码全景分析》之过滤