欧美vvv,亚洲第一成人在线,亚洲成人欧美日韩在线观看,日本猛少妇猛色XXXXX猛叫

新聞資訊

    承接上文

    TCP網(wǎng)絡包傳輸?shù)恼麄€過程

    網(wǎng)絡基礎二

    網(wǎng)絡基礎一

    對于開發(fā)者來講,只使用標準庫進行網(wǎng)絡開發(fā),那是見自己;如果你了解背后的原理再進行開發(fā),那是見天地;如果你了解原理并進行了創(chuàng)新,比如說開發(fā)出來自己的網(wǎng)絡通信協(xié)議 ,那是見眾生。

    http狀態(tài)碼的含義

    200-300之間的狀態(tài)碼代表一切正常;

    300-400的狀態(tài)碼代表轉向了別的地方,例如301是永久重定向,302是臨時重定向,304是帶參數(shù)重定向(如果參數(shù)不滿足,則從緩存中拿已有的結果);

    400-500之間代表你的錯,比如404,表示你輸入錯的網(wǎng)址;

    500-600代表是網(wǎng)站的錯,網(wǎng)站服務器內(nèi)部出現(xiàn)了問題。

    耗時2.5秒表示從點擊回車鍵開始到網(wǎng)站打開需要的所有時間,時間線以4種顏色區(qū)分網(wǎng)站打開過程中的每個階段,第一個階段是初始連接階段,

    因為發(fā)生在瞬間,導致只能看到三個顏色的標記;

    第二個紫色表示SSL加密協(xié)議密鑰的階段;

    第三個綠色是服務器準備內(nèi)容的階段;

    第四個藍色代表下載內(nèi)容階段;

    從域名開始了解具體發(fā)生了什么

    域名組成部分中,域名的末尾從斜桿開始,代表著要訪問網(wǎng)站其他地方的路徑;

    斜桿代表要訪問網(wǎng)站的默認索引頁,比如網(wǎng)站首頁;

    斜桿?字母、數(shù)字等組成的路徑表示網(wǎng)站的其他地方;

    域名的主題部分,好比存儲在通信錄中的人名,每個聯(lián)系人都對應著自己的電話號碼,域名也一樣,它對應的有相應服務器的ip,這樣任何人訪問網(wǎng)站,就可以知道去哪個服務器里要我們想看到的東西。

    通常驗證是否和服務器互通使用ping命令

    除了服務器禁ping的情況,ping不超時就說明可以和服務器相互交互,命令中參數(shù)-c 4表示和服務器交互了4次。

    ping域名的后面,出現(xiàn)了ip地址,相當于在地址欄輸入網(wǎng)址按下回車,第一件事就是去找域名對應的服務器地址,這個ip地址是從DNS服務器里存儲的地址本里找出來的,如果你訪問過該網(wǎng)站,就從本機緩存的數(shù)據(jù)里找,如果找不到就從路由器設置的電信服務商提供的DNS服務器中找,

    如果還找不到,就從網(wǎng)站域名服務商提供的DNS服務器中找,所以DNS域名服務器存儲的地址本是分布式的,可以用nslookup命令驗證下。

    如何從DNS查詢域名對應的ip

    使用nslookup得到應答,可以看到給b站域名響應了4、5個地址,大概率是因為b站的流量巨大,使用了CDN做了資源加速,讓你從最近的服務器中提取資源。

    將DNS服務器的設置為8.8.8.8

    b站的響應結果是一樣的,那起初DNS的域名是誰操作綁定在一起的,當然是b站所屬的公司,注冊了bilibili的域名,指定好域名的DNS,做好A記錄解析來對應好服務器的ip地址,這樣就可以通過域名訪問b站了。

    查看域名的注冊信息

    whois bilibili
    

    這是域名的注冊信息,可以反映出域名注冊的過期日期、服務商是阿里云DNS服務器。

    域名前的https是超文本傳輸協(xié)議,https代表超文本內(nèi)容是加密傳輸?shù)囊员WC傳輸?shù)陌踩?/span>

    服務器和客戶端的加密協(xié)議的協(xié)商就對應網(wǎng)絡時間軸的紫色部分,

    地址欄的小鎖圖標代表信任的安全認證的加密證書,

    證書的使用人、頒發(fā)人和證書的有效期以及指紋信息、傳輸內(nèi)容的加密是非對稱加密、服務器持有密鑰、客戶端持有公鑰、在證書的詳細信息標簽中可以看到更詳細的證書信息,例如證書的簽名算法和公鑰的路徑信息等。

    http2協(xié)議必須使用加密證書,它保證一個客戶端與服務器保持一個連接,比http1.1更高效。

    https加密傳輸每次都是要有協(xié)商時間的,說明它比http非加密的方式訪問網(wǎng)站要慢。

    如果瀏覽器的要求必須使用加密的方式傳輸,如果證書過期或者沒有使用證書,會將小鎖換成不安全警告。

    模擬不加密訪問

    使用的是http1.1非加密協(xié)議,請求的是80端口,返回301的狀態(tài)碼,表示b站將域名永久重定向到帶www的域名上。

    模擬https協(xié)議的域名

    訪問的是443端口,

    這里出現(xiàn)了協(xié)商密鑰交互的握手部分,協(xié)商成功之后將使用TLS證書進行加密鏈接,使用http2的協(xié)議進行傳輸;

    這里特別說明下http2協(xié)議是http1.1協(xié)議的升級版,http2協(xié)議必須使用加密證書,它保證一個客戶端與服務器只保持一個連接,比http1.1更高效。

    互聯(lián)網(wǎng)之所以互聯(lián),是因為它們都是基于TCP/IP協(xié)議族進行傳輸,客戶端與服務器的每一次交互都要通過2*7=14到關卡。

    OSI七層模型

    TCP/IP的OSI 7層模型,雖然它不能代表現(xiàn)實中實際的網(wǎng)絡模型但足具代表性。

    按照客戶端數(shù)據(jù)流向的方向,從7層模型的最高層講起:

    第7層應用層是由應用程序負責的協(xié)議層,比如HTTP/SMTP/POP協(xié)議等;

    第6層表示層是負責數(shù)據(jù)的加解密,數(shù)據(jù)的轉換和壓縮,例如http協(xié)議數(shù)據(jù)傳輸中的gzip數(shù)據(jù)壓縮,縮小數(shù)據(jù)大小以節(jié)約網(wǎng)絡傳輸數(shù)據(jù)的流量;

    第5層會話層,例如開發(fā)者工具窗口中時間線的紫色部分負責的就是數(shù)據(jù)加密協(xié)議的協(xié)商工作,就是在這一層完成的;

    第5、6、7層可以統(tǒng)稱為應用程序層,在數(shù)據(jù)向下傳輸?shù)碾A段,在數(shù)據(jù)段前加入http標頭,表示請求的方法是get還是post請求;

    第4層就是經(jīng)典的傳輸層,負責數(shù)據(jù)是按照TCP的方式還是按照UDP的方式傳輸,比如HTTP是按照TCP方式傳輸?shù)摹?/span>

    這一層會為數(shù)據(jù)追加20個字節(jié)的TCP標頭,例如源端口、目標端口、請求序列號。

    第三層網(wǎng)絡層,負責數(shù)據(jù)路由的選擇和數(shù)據(jù)分組的傳輸,典型的IP和IPv6協(xié)議就在這一層,這一層會為數(shù)據(jù)段追加來源IP和目標IP地址,

    路由選擇,當你輸入網(wǎng)址按下回車,找到IP后進入網(wǎng)絡層,路由選擇是按照你訪問的目標服務器的物理距離來決定第二層數(shù)據(jù)先到哪里,比如你做的是TCP火車還是UDP飛機,從上海到北京你都必須經(jīng)過江蘇安徽河北才能到達是一樣的。

    模擬路由的選擇

    下一跳次數(shù)越多,說明經(jīng)停站越多,達到目的地的時間就越長。

    這就是為什么使用nslookup查找b站域名ip的時候,會有多個ip,是因為b站為了讓用戶更快的訪問網(wǎng)站使用了CDN技術,選擇離你最近的服務器中快速的打開b站。

    第二層數(shù)據(jù)鏈路層,這一層確保物理層傳輸?shù)臄?shù)據(jù)幀按需傳輸,并在這一層加入了來源MAC地址和目標MAC地址標頭即網(wǎng)卡,每個網(wǎng)卡都有自己全球唯一的MAC地址確保傳輸?shù)臄?shù)據(jù)找不錯設備,這里的MAC地址不一定是起初訪問的設備MAC地址和真正的目的地的服務器的MAC地址,這是由第三層路由選擇的下一跳地址決定的。

    第一層就是物理層,例如網(wǎng)線、Wi-Fi等方式將你的二進制比特流的數(shù)據(jù)送出去。

    當輸入網(wǎng)址按下回車每一次從客戶端發(fā)送出的請求數(shù)據(jù),都會從第7層逐漸處理,加入不同的標頭,然后達到目標地址,到達目標地址再反向,從第1層逐層去掉標頭,直到網(wǎng)絡的第7層,最終服務器拿到干凈的請求數(shù)據(jù)。

    知道了數(shù)據(jù)是怎么流向的,客戶端和服務器還要確保數(shù)據(jù)鏈路的通暢,它倆必須要建立可靠的鏈接通道。

    三次握手

    開發(fā)者工具窗口中網(wǎng)絡時間軸中瞬間發(fā)生的第一個階段:初始鏈接階段,第一次握手是客戶端帶上序列號x,給服務器打招呼:b站美女你好靚,可以認識下不?

    客戶端進入SYN-SEND的同步發(fā)送狀態(tài);

    第二次握手服務器監(jiān)聽相關的端口,開通http協(xié)議請求端口,類似80和443端口,服務器監(jiān)聽端口收到了消息之后,帶上自己的序列號y并帶上ack確認碼(客戶端帶來了序列號+1),然后回復:hi,你也好帥哦。

    服務器進入SYN_RCVD狀態(tài)。

    第三次握手,客戶端收到服務器的回復,帶上服務器回復的序列號+1的確認碼發(fā)送給服務器建立連接成功,就可以愉快的傳遞數(shù)據(jù)了。

    四次分手

    當客戶端打算關上連接,會主動帶上握手時客戶端確認碼作為序列號發(fā)送給服務器斷開連接,客戶端進入FIN-WAIT-1狀態(tài),發(fā)生了一次揮手,服務器收到了分手的消息,會帶上自己的序列號v即客戶端帶來的序列號+1作為確認碼回復給客戶端。

    服務端:分手消息我收到了,我想想,服務端進入CLOSE_WAIT等待關閉的狀態(tài),客戶端進入繼續(xù)等待FIN-WAIT-2的狀態(tài);然后發(fā)生第二次揮手,服務器想了想沒有更多的話要給客戶端說的,于是帶上了序列號w和序列號+1的確認碼給客戶端發(fā)送了分手請求:分手就分手沒有什么好說的了,然后服務器進入LAST-ACK最后確認狀態(tài);發(fā)生了第三次揮手,客戶端收到了服務器的分手請求之后,帶上+1的序列號和+1的確認碼回復給服務器,于是服務器關閉了連接,客戶端進入了定時等待時間,這兩個報文的最大生存周期,不同的操作系統(tǒng)不一樣,大約是1-4分鐘即俗稱的冷靜期,冷靜期后客戶端才真正的斷開。

    小結

    瀏覽器輸入域名網(wǎng)址首先通過DNS找域名對應的ip地址,然后是三次握手進入初始鏈接階段,每次鏈接都要經(jīng)過TCP/IP七層模型, 鏈接初始成功后進入第二階段SSL的加密協(xié)議的證書協(xié)商階段,接下來是服務器準備我們需要的內(nèi)容,準備好內(nèi)容之后就是客戶端下載內(nèi)容的階段。

    當瀏覽器請求網(wǎng)頁時,它會向 Web 服務器發(fā)送特定信息,這些信息不能被直接讀取,因為這些信息是作為 HTTP 請求的頭的一部分進行傳輸?shù)摹D梢圆榭?HTTP 協(xié)議 了解更多相關信息。

    以下是來自于瀏覽器端的重要頭信息,您可以在 Web 編程中頻繁使用:

    頭信息描述
    Accept這個頭信息指定瀏覽器或其他客戶端可以處理的 MIME 類型。值 image/pngimage/jpeg 是最常見的兩種可能值。
    Accept-Charset這個頭信息指定瀏覽器可以用來顯示信息的字符集。例如 ISO-8859-1。
    Accept-Encoding這個頭信息指定瀏覽器知道如何處理的編碼類型。值 gzipcompress 是最常見的兩種可能值。
    Accept-Language這個頭信息指定客戶端的首選語言,在這種情況下,Servlet 會產(chǎn)生多種語言的結果。例如,en、en-us、ru 等。
    Authorization這個頭信息用于客戶端在訪問受密碼保護的網(wǎng)頁時識別自己的身份。
    Connection這個頭信息指示客戶端是否可以處理持久 HTTP 連接。持久連接允許客戶端或其他瀏覽器通過單個請求來檢索多個文件。值 Keep-Alive 意味著使用了持續(xù)連接。
    Content-Length這個頭信息只適用于 POST 請求,并給出 POST 數(shù)據(jù)的大小(以字節(jié)為單位)。
    Cookie這個頭信息把之前發(fā)送到瀏覽器的 cookies 返回到服務器。
    Host這個頭信息指定原始的 URL 中的主機和端口。
    If-Modified-Since這個頭信息表示只有當頁面在指定的日期后已更改時,客戶端想要的頁面。如果沒有新的結果可以使用,服務器會發(fā)送一個 304 代碼,表示 Not Modified 頭信息。
    If-Unmodified-Since這個頭信息是 If-Modified-Since 的對立面,它指定只有當文檔早于指定日期時,操作才會成功。
    Referer這個頭信息指示所指向的 Web 頁的 URL。例如,如果您在網(wǎng)頁 1,點擊一個鏈接到網(wǎng)頁 2,當瀏覽器請求網(wǎng)頁 2 時,網(wǎng)頁 1 的 URL 就會包含在 Referer 頭信息中。
    User-Agent這個頭信息識別發(fā)出請求的瀏覽器或其他客戶端,并可以向不同類型的瀏覽器返回不同的內(nèi)容。

    讀取 HTTP 頭的方法

    下面的方法可用在 Servlet 程序中讀取 HTTP 頭。這些方法通過 HttpServletRequest 對象可用。

    序號方法 & 描述
    1Cookie[] getCookies()

    返回一個數(shù)組,包含客戶端發(fā)送該請求的所有的 Cookie 對象。

    2Enumeration getAttributeNames()

    返回一個枚舉,包含提供給該請求可用的屬性名稱。

    3Enumeration getHeaderNames()

    返回一個枚舉,包含在該請求中包含的所有的頭名。

    4Enumeration getParameterNames()

    返回一個 String 對象的枚舉,包含在該請求中包含的參數(shù)的名稱。

    5HttpSession getSession()

    返回與該請求關聯(lián)的當前 session 會話,或者如果請求沒有 session 會話,則創(chuàng)建一個。

    6HttpSession getSession(boolean create)

    返回與該請求關聯(lián)的當前 HttpSession,或者如果沒有當前會話,且創(chuàng)建是真的,則返回一個新的 session 會話。

    7Locale getLocale()

    基于 Accept-Language 頭,返回客戶端接受內(nèi)容的首選的區(qū)域設置。

    8Object getAttribute(String name)

    以對象形式返回已命名屬性的值,如果沒有給定名稱的屬性存在,則返回 null。

    9ServletInputStream getInputStream()

    使用 ServletInputStream,以二進制數(shù)據(jù)形式檢索請求的主體。

    10String getAuthType()

    返回用于保護 Servlet 的身份驗證方案的名稱,例如,"BASIC" 或 "SSL",如果JSP沒有受到保護則返回 null。

    11String getCharacterEncoding()

    返回請求主體中使用的字符編碼的名稱。

    12String getContentType()

    返回請求主體的 MIME 類型,如果不知道類型則返回 null。

    13String getContextPath()

    返回指示請求上下文的請求 URI 部分。

    14String getHeader(String name)

    以字符串形式返回指定的請求頭的值。

    15String getMethod()

    返回請求的 HTTP 方法的名稱,例如,GET、POST 或 PUT。

    16String getParameter(String name)

    以字符串形式返回請求參數(shù)的值,或者如果參數(shù)不存在則返回 null。

    17String getPathInfo()

    當請求發(fā)出時,返回與客戶端發(fā)送的 URL 相關的任何額外的路徑信息。

    18String getProtocol()

    返回請求協(xié)議的名稱和版本。

    19String getQueryString()

    返回包含在路徑后的請求 URL 中的查詢字符串。

    20String getRemoteAddr()

    返回發(fā)送請求的客戶端的互聯(lián)網(wǎng)協(xié)議(IP)地址。

    21String getRemoteHost()

    返回發(fā)送請求的客戶端的完全限定名稱。

    22String getRemoteUser()

    如果用戶已通過身份驗證,則返回發(fā)出請求的登錄用戶,或者如果用戶未通過身份驗證,則返回 null。

    23String getRequestURI()

    從協(xié)議名稱直到 HTTP 請求的第一行的查詢字符串中,返回該請求的 URL 的一部分。

    24String getRequestedSessionId()

    返回由客戶端指定的 session 會話 ID。

    25String getServletPath()

    返回調(diào)用 JSP 的請求的 URL 的一部分。

    26String[] getParameterValues(String name)

    返回一個字符串對象的數(shù)組,包含所有給定的請求參數(shù)的值,如果參數(shù)不存在則返回 null。

    27boolean isSecure()

    返回一個布爾值,指示請求是否使用安全通道,如 HTTPS。

    28int getContentLength()

    以字節(jié)為單位返回請求主體的長度,并提供輸入流,或者如果長度未知則返回 -1。

    29int getIntHeader(String name)

    返回指定的請求頭的值為一個 int 值。

    30int getServerPort()

    返回接收到這個請求的端口號。

    31int getParameterMap()

    將參數(shù)封裝成 Map 類型。

    HTTP Header 請求實例

    下面的實例使用 HttpServletRequest 的 getHeaderNames() 方法讀取 HTTP 頭信息。該方法返回一個枚舉,包含與當前的 HTTP 請求相關的頭信息。

    一旦我們有一個枚舉,我們可以以標準方式循環(huán)枚舉,使用 hasMoreElements() 方法來確定何時停止,使用 nextElement() 方法來獲取每個參數(shù)的名稱。

    //導入必需的 java 庫import java.io.IOException;import java.io.PrintWriter;import java.util.Enumeration;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;@WebServlet("/DisplayHeader")//擴展 HttpServlet 類public class DisplayHeader extends HttpServlet { // 處理 GET 方法請求的方法 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 設置響應內(nèi)容類型 response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); String title = "HTTP Header 請求實例 - 菜鳥教程實例"; String docType = "<!DOCTYPE html> \n"; out.println(docType + "<html>\n" + "<head><meta charset=\"utf-8\"><title>" + title + "</title></head>\n"+ "<body bgcolor=\"#f0f0f0\">\n" + "<h1 align=\"center\">" + title + "</h1>\n" + "<table width=\"100%\" border=\"1\" align=\"center\">\n" + "<tr bgcolor=\"#949494\">\n" + "<th>Header 名稱</th><th>Header 值</th>\n"+ "</tr>\n"); Enumeration headerNames = request.getHeaderNames(); while(headerNames.hasMoreElements()) { String paramName = (String)headerNames.nextElement(); out.print("<tr><td>" + paramName + "</td>\n"); String paramValue = request.getHeader(paramName); out.println("<td> " + paramValue + "</td></tr>\n"); } out.println("</table>\n</body></html>"); } // 處理 POST 方法請求的方法 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }}

    以上測試實例是位于 TomcatTest 項目下,對應的 web.xml 配置為:

網(wǎng)站首頁   |    關于我們   |    公司新聞   |    產(chǎn)品方案   |    用戶案例   |    售后服務   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區(qū)    電話:010-     郵箱:@126.com

備案號:冀ICP備2024067069號-3 北京科技有限公司版權所有