mirror of
https://gitee.com/coder-xiaomo/notes
synced 2025-01-11 20:18:16 +08:00
1 line
40 KiB
JavaScript
1 line
40 KiB
JavaScript
"use strict";(self.webpackChunkvuepress=self.webpackChunkvuepress||[]).push([[652],{4117:(e,l,n)=>{n.r(l),n.d(l,{data:()=>a});const a={key:"v-45077b3a",path:"/web-server/",title:"第一期学习活动",lang:"zh-CN",frontmatter:{sidebarDepth:2},excerpt:"",headers:[{level:2,title:"第1天",slug:"第1天",children:[{level:3,title:"任务:Web服务器基本工作原理学习",slug:"任务-web服务器基本工作原理学习",children:[]},{level:3,title:"作业",slug:"作业",children:[]}]},{level:2,title:"第2天",slug:"第2天",children:[{level:3,title:"任务:HTTP协议学习 & F12 & wireshark抓包",slug:"任务-http协议学习-f12-wireshark抓包",children:[]},{level:3,title:"作业",slug:"作业-1",children:[{level:4,title:"HTTP请求主要由哪几个部分组成?",slug:"http请求主要由哪几个部分组成",children:[]},{level:4,title:"HTTP响应主要由哪几部分组成?",slug:"http响应主要由哪几部分组成",children:[]},{level:4,title:"HTTP头部和数据如何组织在一起?",slug:"http头部和数据如何组织在一起",children:[]},{level:4,title:"Wireshark抓包",slug:"wireshark抓包",children:[]}]}]},{level:2,title:"第3天",slug:"第3天",children:[{level:3,title:"任务:套接字编程基础知识",slug:"任务-套接字编程基础知识",children:[]},{level:3,title:"作业",slug:"作业-2",children:[{level:4,title:"什么是套接字?",slug:"什么是套接字",children:[]},{level:4,title:"套接字有哪几个类型?",slug:"套接字有哪几个类型",children:[]},{level:4,title:"用套接字编写一个客户端和服务端,分别有哪几个步骤?",slug:"用套接字编写一个客户端和服务端-分别有哪几个步骤",children:[]}]}]},{level:2,title:"★ 第4天",slug:"★-第4天",children:[{level:3,title:"任务:编写一个TCP Client,发出一个简单的HTTP请求",slug:"任务-编写一个tcp-client-发出一个简单的http请求",children:[]},{level:3,title:"作业",slug:"作业-3",children:[]}]},{level:2,title:"★ 第5天",slug:"★-第5天",children:[{level:3,title:"任务:编写一个TCP Server,发出一个简单的HTTP响应",slug:"任务-编写一个tcp-server-发出一个简单的http响应",children:[]},{level:3,title:"作业",slug:"作业-4",children:[]}]},{level:2,title:"★ 第8天",slug:"★-第8天",children:[{level:3,title:"任务:改造TCP Server,发送一个HTML文件",slug:"任务-改造tcp-server-发送一个html文件",children:[]}]},{level:2,title:"★ 第9天",slug:"★-第9天",children:[{level:3,title:"任务:使用多线程",slug:"任务-使用多线程",children:[]},{level:3,title:"作业",slug:"作业-5",children:[]}]},{level:2,title:"第10天",slug:"第10天",children:[{level:3,title:"任务:设计并使用配置文件",slug:"任务-设计并使用配置文件",children:[]},{level:3,title:"作业",slug:"作业-6",children:[]},{level:3,title:"作业",slug:"作业-7",children:[]},{level:3,title:"作业",slug:"作业-8",children:[]},{level:3,title:"作业",slug:"作业-9",children:[]},{level:3,title:"作业",slug:"作业-10",children:[{level:4,title:"回答轩辕大佬的问题:",slug:"回答轩辕大佬的问题",children:[]},{level:4,title:"其他",slug:"其他",children:[]}]}]}],filePathRelative:"web-server/README.md",git:{updatedTime:1638721433e3,contributors:[{name:"Coding Zhang",email:"2291200076@qq.com",commits:1}]}}},740:(e,l,n)=>{n.r(l),n.d(l,{default:()=>ln});var a=n(6252),s=n(3806),r=n(8700),t=n(4777),i=n(2214),_=n(1319),u=n(897),c=n(9698);const h=(0,a._)("h1",{id:"第一期学习活动",tabindex:"-1"},[(0,a._)("a",{class:"header-anchor",href:"#第一期学习活动","aria-hidden":"true"},"#"),(0,a.Uk)(" 第一期学习活动")],-1),p=(0,a._)("h2",{id:"第1天",tabindex:"-1"},[(0,a._)("a",{class:"header-anchor",href:"#第1天","aria-hidden":"true"},"#"),(0,a.Uk)(" 第1天")],-1),o=(0,a._)("h3",{id:"任务-web服务器基本工作原理学习",tabindex:"-1"},[(0,a._)("a",{class:"header-anchor",href:"#任务-web服务器基本工作原理学习","aria-hidden":"true"},"#"),(0,a.Uk)(" 任务:Web服务器基本工作原理学习")],-1),d=(0,a._)("p",null,"学习资料: 1、https://www.cnblogs.com/BOHB-yunying/articles/10911192.html",-1),b=(0,a._)("p",null,"2、《Web工作原理》见附件",-1),m=(0,a._)("p",null,"作业:写一篇小短文,发布在星球,小短文中需要回答几个问题",-1),k=(0,a._)("p",null,"一个web服务器,最基本的由哪几个核心组件组成?",-1),g=(0,a._)("p",null,"讲述一下,web服务器从收到一个请求,到完成这个请求的响应,主要流程是什么?",-1),T=(0,a._)("p",null,"将自己理解的Web服务器工作原理,绘制一张图",-1),A=(0,a._)("p",null,[(0,a.Uk)("附件:"),(0,a._)("a",{href:"/web-server/files/day1-Web%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86.pdf"},"Web工作原理.pdf")],-1),f=(0,a._)("h3",{id:"作业",tabindex:"-1"},[(0,a._)("a",{class:"header-anchor",href:"#作业","aria-hidden":"true"},"#"),(0,a.Uk)(" 作业")],-1),v=(0,a._)("p",null,"看了一下网上搜索出来的感觉大都很专业,我就说说我自己的看法叭",-1),w=(0,a._)("p",null,"web服务器组件我理解的是包含以下部分",-1),E=(0,a._)("ul",null,[(0,a._)("li",null,"配置文件、默认错误页面(像404, 500等错误页模板)"),(0,a._)("li",null,"日志记录模块"),(0,a._)("li",null,"端口监听模块"),(0,a._)("li",null,"业务处理模块"),(0,a._)("li",null,"请求响应模块"),(0,a._)("li",null,"扩展模块(如反向代理等)")],-1),U=(0,a._)("p",null,"web服务器主要完成以下几件事",-1),x=(0,a._)("ol",null,[(0,a._)("li",null,[(0,a._)("p",null,"监听到客户端发来的请求"),(0,a._)("p",null,"涉及到计算机网络结构方面的知识")]),(0,a._)("li",null,[(0,a._)("p",null,"处理请求"),(0,a._)("ol",null,[(0,a._)("li",null,[(0,a._)("p",null,"取得请求方法(GET, POST, PUT等),解析url,进行路由")]),(0,a._)("li",null,[(0,a._)("p",null,"通过路由知道客户端的请求"),(0,a._)("p",null,"分成静态、动态两类,静态资源直接返回给客户端就行了,动态资源需要去对应提供服务的业务取得(像php, java, asp.net等等)")])])]),(0,a._)("li",null,[(0,a._)("p",null,"将响应返回给用户 响应头中还包含一些扩展信息(像web服务器版本信息,MIME,缓存配置信息,静态资源还会有修改时间)")])],-1),P=(0,a._)("p",null,[(0,a._)("img",{src:s,alt:"Web服务器工作原理"})],-1),H=(0,a._)("h2",{id:"第2天",tabindex:"-1"},[(0,a._)("a",{class:"header-anchor",href:"#第2天","aria-hidden":"true"},"#"),(0,a.Uk)(" 第2天")],-1),W=(0,a._)("h3",{id:"任务-http协议学习-f12-wireshark抓包",tabindex:"-1"},[(0,a._)("a",{class:"header-anchor",href:"#任务-http协议学习-f12-wireshark抓包","aria-hidden":"true"},"#"),(0,a.Uk)(" 任务:HTTP协议学习 & F12 & wireshark抓包")],-1),C=(0,a._)("p",null,"学习资料: https://www.ruanyifeng.com/blog/2016/08/http.html",-1),D=(0,a._)("p",null,"https://zhuanlan.zhihu.com/p/77376952",-1),M=(0,a._)("p",null,"https://haokan.baidu.com/v?pd=wisenatural&vid=9883591515530208938",-1),R=(0,a._)("p",null,"作业:写一篇小短文,发布在星球,完成下面这些内容",-1),S=(0,a._)("ul",null,[(0,a._)("li",null,"HTTP请求主要由哪几个部分组成?"),(0,a._)("li",null,"HTTP响应主要由哪几部分组成?"),(0,a._)("li",null,"HTTP头部和数据如何组织在一起?"),(0,a._)("li",null,"这是世界上第一个网页: http://info.cern.ch/hypertext/WWW/TheProject.html")],-1),y=(0,a._)("p",null,"使用浏览器访问这个URL,并使用wireshark抓包,分析请求和响应。",-1),q=(0,a._)("p",null,"请求:Method、URI、HTTP版本、Headers",-1),N=(0,a._)("p",null,"响应:状态码、Headers、HTML内容",-1),F=(0,a._)("h3",{id:"作业-1",tabindex:"-1"},[(0,a._)("a",{class:"header-anchor",href:"#作业-1","aria-hidden":"true"},"#"),(0,a.Uk)(" 作业")],-1),L=(0,a._)("h4",{id:"http请求主要由哪几个部分组成",tabindex:"-1"},[(0,a._)("a",{class:"header-anchor",href:"#http请求主要由哪几个部分组成","aria-hidden":"true"},"#"),(0,a.Uk)(" HTTP请求主要由哪几个部分组成?")],-1),O=(0,a._)("p",null,[(0,a._)("strong",null,"请求报文")],-1),I=(0,a._)("ol",null,[(0,a._)("li",null,[(0,a._)("p",null,[(0,a._)("strong",null,"请求行"),(0,a.Uk)(":请求方法字段、URL字段和HTTP协议版本")]),(0,a._)("p",null,"例如:GET /index.html HTTP/1.1"),(0,a._)("p",null,"get方法将数据拼接在url后面,传递参数受限"),(0,a._)("p",null,"请求方法:GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT")]),(0,a._)("li",null,[(0,a._)("p",null,[(0,a._)("strong",null,"请求头"),(0,a.Uk)("(key value形式)")]),(0,a._)("ul",null,[(0,a._)("li",null,[(0,a._)("p",null,"User-Agent:产生请求的浏览器类型。")]),(0,a._)("li",null,[(0,a._)("p",null,"Accept:客户端可识别的内容类型列表。")]),(0,a._)("li",null,[(0,a._)("p",null,"Host:主机地址")])])]),(0,a._)("li",null,[(0,a._)("p",null,[(0,a._)("strong",null,"请求数据")]),(0,a._)("p",null,"post方法中,会把数据以key value形式发送请求")]),(0,a._)("li",null,[(0,a._)("p",null,[(0,a._)("strong",null,"空行")]),(0,a._)("p",null,"发送回车符和换行符,通知服务器以下不再有请求头")])],-1),B=(0,a._)("h4",{id:"http响应主要由哪几部分组成",tabindex:"-1"},[(0,a._)("a",{class:"header-anchor",href:"#http响应主要由哪几部分组成","aria-hidden":"true"},"#"),(0,a.Uk)(" HTTP响应主要由哪几部分组成?")],-1),z=(0,a._)("p",null,[(0,a._)("strong",null,"响应报文")],-1),G=(0,a._)("ol",null,[(0,a._)("li",null,[(0,a._)("p",null,[(0,a._)("strong",null,"状态行")])]),(0,a._)("li",null,[(0,a._)("p",null,[(0,a._)("strong",null,"消息报头")])])],-1),K=(0,a._)("p",null,[(0,a._)("strong",null,"3. 响应正文")],-1),j=(0,a._)("h4",{id:"http头部和数据如何组织在一起",tabindex:"-1"},[(0,a._)("a",{class:"header-anchor",href:"#http头部和数据如何组织在一起","aria-hidden":"true"},"#"),(0,a.Uk)(" HTTP头部和数据如何组织在一起?")],-1),Q=(0,a._)("p",null,[(0,a._)("img",{src:r,alt:"HTTP请求报文"})],-1),X=(0,a._)("h4",{id:"wireshark抓包",tabindex:"-1"},[(0,a._)("a",{class:"header-anchor",href:"#wireshark抓包","aria-hidden":"true"},"#"),(0,a.Uk)(" Wireshark抓包")],-1),Y=(0,a._)("p",null,"首先打开Wireshark,访问:http://info.cern.ch/hypertext/WWW/TheProject.html",-1),Z=(0,a._)("p",null,[(0,a._)("img",{src:t,alt:""})],-1),V=(0,a._)("p",null,[(0,a.Uk)("使用Wireshark抓包(按照 "),(0,a._)("code",null,"ip.src == 188.184.21.108"),(0,a.Uk)(" 过滤,先 "),(0,a._)("code",null,"Ctrl+R"),(0,a.Uk)(" 清除记录一次)")],-1),J=(0,a._)("p",null,[(0,a._)("img",{src:i,alt:"day2-wireshark"})],-1),$=(0,a._)("p",null,[(0,a.Uk)("按 "),(0,a._)("code",null,"Ctrl+Alt+Shift+T"),(0,a.Uk)(" 追踪TCP流(右键 追踪流、TCP流)")],-1),ee=(0,a._)("p",null,[(0,a._)("img",{src:_,alt:"day2-trace-tcp-stream"})],-1),le=(0,a._)("div",{class:"language-text ext-text line-numbers-mode"},[(0,a._)("pre",{class:"language-text"},[(0,a._)("code",null,'GET /hypertext/WWW/TheProject.html HTTP/1.1\nHost: info.cern.ch\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:94.0) Gecko/20100101 Firefox/94.0\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\nAccept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2\nAccept-Encoding: gzip, deflate\nConnection: keep-alive\nUpgrade-Insecure-Requests: 1\nPragma: no-cache\nCache-Control: no-cache\n\nHTTP/1.1 200 OK\nDate: Mon, 29 Nov 2021 12:28:56 GMT\nServer: Apache\nLast-Modified: Thu, 03 Dec 1992 08:37:20 GMT\nETag: "8a9-291e721905000"\nAccept-Ranges: bytes\nContent-Length: 2217\nConnection: close\nContent-Type: text/html\n\n<HEADER>\n<TITLE>The World Wide Web project</TITLE>\n<NEXTID N="55">\n</HEADER>\n<BODY>\n<H1>World Wide Web</H1>The WorldWideWeb (W3) is a wide-area<A\nNAME=0 HREF="WhatIs.html">\nhypermedia</A> information retrieval\ninitiative aiming to give universal\naccess to a large universe of documents.<P>\nEverything there is online about\nW3 is linked directly or indirectly\nto this document, including an <A\nNAME=24 HREF="Summary.html">executive\nsummary</A> of the project, <A\nNAME=29 HREF="Administration/Mailing/Overview.html">Mailing lists</A>\n, <A\nNAME=30 HREF="Policy.html">Policy</A> , November\'s <A\nNAME=34 HREF="News/9211.html">W3 news</A> ,\n<A\nNAME=41 HREF="FAQ/List.html">Frequently Asked Questions</A> .\n<DL>\n<DT><A\nNAME=44 HREF="../DataSources/Top.html">What\'s out there?</A>\n<DD> Pointers to the\nworld\'s online information,<A\nNAME=45 HREF="../DataSources/bySubject/Overview.html"> subjects</A>\n, <A\nNAME=z54 HREF="../DataSources/WWW/Servers.html">W3 servers</A>, etc.\n<DT><A\nNAME=46 HREF="Help.html">Help</A>\n<DD> on the browser you are using\n<DT><A\nNAME=13 HREF="Status.html">Software Products</A>\n<DD> A list of W3 project\ncomponents and their current state.\n(e.g. <A\nNAME=27 HREF="LineMode/Browser.html">Line Mode</A> ,X11 <A\nNAME=35 HREF="Status.html#35">Viola</A> , <A\nNAME=26 HREF="NeXT/WorldWideWeb.html">NeXTStep</A>\n, <A\nNAME=25 HREF="Daemon/Overview.html">Servers</A> , <A\nNAME=51 HREF="Tools/Overview.html">Tools</A> ,<A\nNAME=53 HREF="MailRobot/Overview.html"> Mail robot</A> ,<A\nNAME=52 HREF="Status.html#57">\nLibrary</A> )\n<DT><A\nNAME=47 HREF="Technical.html">Technical</A>\n<DD> Details of protocols, formats,\nprogram internals etc\n<DT><A\nNAME=40 HREF="Bibliography.html">Bibliography</A>\n<DD> Paper documentation\non W3 and references.\n<DT><A\nNAME=14 HREF="People.html">People</A>\n<DD> A list of some people involved\nin the project.\n<DT><A\nNAME=15 HREF="History.html">History</A>\n<DD> A summary of the history\nof the project.\n<DT><A\nNAME=37 HREF="Helping.html">How can I help</A> ?\n<DD> If you would like\nto support the web..\n<DT><A\nNAME=48 HREF="../README.html">Getting code</A>\n<DD> Getting the code by<A\nNAME=49 HREF="LineMode/Defaults/Distribution.html">\nanonymous FTP</A> , etc.</A>\n</DL>\n</BODY>\n')]),(0,a._)("div",{class:"line-numbers"},[(0,a._)("span",{class:"line-number"},"1"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"2"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"3"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"4"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"5"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"6"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"7"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"8"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"9"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"10"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"11"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"12"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"13"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"14"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"15"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"16"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"17"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"18"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"19"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"20"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"21"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"22"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"23"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"24"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"25"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"26"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"27"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"28"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"29"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"30"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"31"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"32"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"33"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"34"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"35"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"36"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"37"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"38"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"39"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"40"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"41"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"42"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"43"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"44"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"45"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"46"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"47"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"48"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"49"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"50"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"51"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"52"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"53"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"54"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"55"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"56"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"57"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"58"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"59"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"60"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"61"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"62"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"63"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"64"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"65"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"66"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"67"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"68"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"69"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"70"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"71"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"72"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"73"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"74"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"75"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"76"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"77"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"78"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"79"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"80"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"81"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"82"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"83"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"84"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"85"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"86"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"87"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"88"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"89"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"90"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"91"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"92"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"93"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"94"),(0,a._)("br")])],-1),ne=(0,a._)("p",null,[(0,a._)("strong",null,"请求"),(0,a.Uk)(":")],-1),ae=(0,a._)("p",null,"Method:GET",-1),se=(0,a._)("p",null,"URI:/hypertext/WWW/TheProject.html",-1),re=(0,a._)("p",null,"HTTP版本:HTTP/1.1",-1),te=(0,a._)("p",null,"Headers:",-1),ie=(0,a._)("p",null,[(0,a.Uk)("Host: info.cern.ch User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:94.0) Gecko/20100101 Firefox/94.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,"),(0,a._)("em",null,"/"),(0,a.Uk)(";q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Connection: keep-alive Upgrade-Insecure-Requests: 1 Pragma: no-cache Cache-Control: no-cache")],-1),_e=(0,a._)("p",null,[(0,a._)("strong",null,"响应"),(0,a.Uk)(":")],-1),ue=(0,a._)("p",null,"状态码:HTTP/1.1 200 OK",-1),ce=(0,a._)("p",null,"Headers:",-1),he=(0,a._)("p",null,'Date: Mon, 29 Nov 2021 12:28:56 GMT Server: Apache Last-Modified: Thu, 03 Dec 1992 08:37:20 GMT ETag: "8a9-291e721905000" Accept-Ranges: bytes Content-Length: 2217 Connection: close Content-Type: text/html',-1),pe=(0,a._)("p",null,"HTML内容:",-1),oe=(0,a._)("p",null,"略",-1),de=(0,a._)("h2",{id:"第3天",tabindex:"-1"},[(0,a._)("a",{class:"header-anchor",href:"#第3天","aria-hidden":"true"},"#"),(0,a.Uk)(" 第3天")],-1),be=(0,a._)("h3",{id:"任务-套接字编程基础知识",tabindex:"-1"},[(0,a._)("a",{class:"header-anchor",href:"#任务-套接字编程基础知识","aria-hidden":"true"},"#"),(0,a.Uk)(" 任务:套接字编程基础知识")],-1),me=(0,a._)("p",null,"学习资料: 《网络编程》第六章(见附件)",-1),ke=(0,a._)("p",null,"https://www.jianshu.com/p/6ca1c102fc00",-1),ge=(0,a._)("p",null,"https://wenku.baidu.com/view/8d0f749881c758f5f71f6749.html",-1),Te=(0,a._)("p",null,"作业:写一篇小短文,发布在星球,回答几个问题",-1),Ae=(0,a._)("ul",null,[(0,a._)("li",null,"什么是套接字?"),(0,a._)("li",null,"套接字有哪几个类型?"),(0,a._)("li",null,"用套接字编写一个客户端和服务端,分别有哪几个步骤?")],-1),fe=(0,a._)("p",null,[(0,a.Uk)("附件:"),(0,a._)("a",{href:"/web-server/files/day3-Linux%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B.pdf"},"Linux网络编程.pdf")],-1),ve=(0,a._)("h3",{id:"作业-2",tabindex:"-1"},[(0,a._)("a",{class:"header-anchor",href:"#作业-2","aria-hidden":"true"},"#"),(0,a.Uk)(" 作业")],-1),we=(0,a._)("h4",{id:"什么是套接字",tabindex:"-1"},[(0,a._)("a",{class:"header-anchor",href:"#什么是套接字","aria-hidden":"true"},"#"),(0,a.Uk)(" 什么是套接字?")],-1),Ee=(0,a._)("p",null,"套接字(socket)为通信的端点,每个套接字由一个 IP 地址和一个端口号组成。通过网络通信的每对进程需要使用一对套接字,即每个进程各有一个。",-1),Ue=(0,a._)("h4",{id:"套接字有哪几个类型",tabindex:"-1"},[(0,a._)("a",{class:"header-anchor",href:"#套接字有哪几个类型","aria-hidden":"true"},"#"),(0,a.Uk)(" 套接字有哪几个类型?")],-1),xe=(0,a._)("p",null,"套接字的类型",-1),Pe=(0,a._)("p",null,"常用的TCP/IP协议的3种套接字类型如下所示。",-1),He=(0,a._)("p",null,"流套接字(SOCK_STREAM):",-1),We=(0,a._)("p",null,"流套接字用于提供面向连接、可靠的数据传输服务。该服务将保证数据能够实现无差错、无重复发送,并按顺序接收。流套接字之所以能够实现可靠的数据服务,原因在于其使用了传输控制协议,即TCP(The Transmission Control Protocol)协议。",-1),Ce=(0,a._)("p",null,"数据包套接字(SOCK_DGRAM):",-1),De=(0,a._)("p",null,"数据包套接字提供了一种无连接的服务。该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现数据重复,且无法保证顺序地接收到数据。数据包套接字使用UDP(User Datagram Protocol)协议进行数据的传输。由于数据包套接字不能保证数据传输的可靠性,对于有可能出现的数据丢失情况,需要在程序中做相应的处理。",-1),Me=(0,a._)("p",null,"原始套接字(SOCK_RAW):",-1),Re=(0,a._)("p",null,"原始套接字(SOCKET_RAW)允许对较低层次的协议直接访问,比如IP、 ICMP协议,它常用于检验新的协议实现,或者访问现有服务中配置的新设备,因为RAW SOCKET可以自如地控制Windows下的多种协议,能够对网络底层的传输机制进行控制,所以可以应用原始套接字来操纵网络层和传输层应用。比如,我们可以通过RAW SOCKET来接收发向本机的ICMP、IGMP协议包,或者接收TCP/IP栈不能够处理的IP包,也可以用来发送一些自定包头或自定协议的IP包。网络监听技术很大程度上依赖于SOCKET_RAW",-1),Se=(0,a._)("p",null,"原始套接字与标准套接字(标准套接字指的是前面介绍的流套接字和数据包套接字)的区别在于:原始套接字可以读写内核没有处理的IP数据包,而流套接字只能读取TCP协议的数据,数据报套接字只能读取UDP协议的数据。因此,如果要访问其他协议发送数据必须使用原始套接字。",-1),ye=(0,a._)("h4",{id:"用套接字编写一个客户端和服务端-分别有哪几个步骤",tabindex:"-1"},[(0,a._)("a",{class:"header-anchor",href:"#用套接字编写一个客户端和服务端-分别有哪几个步骤","aria-hidden":"true"},"#"),(0,a.Uk)(" 用套接字编写一个客户端和服务端,分别有哪几个步骤?")],-1),qe=(0,a._)("p",null,[(0,a._)("strong",null,"服务端"),(0,a.Uk)(":")],-1),Ne=(0,a._)("ol",null,[(0,a._)("li",null,"返回socket句柄"),(0,a._)("li",null,"设置套接字"),(0,a._)("li",null,"绑定端口,开始监听"),(0,a._)("li",null,"等待客户端连接")],-1),Fe=(0,a._)("p",null,[(0,a._)("strong",null,"客户端"),(0,a.Uk)(":")],-1),Le=(0,a._)("ol",null,[(0,a._)("li",null,"创建连接"),(0,a._)("li",null,"发送请求")],-1),Oe=(0,a._)("hr",null,null,-1),Ie=(0,a._)("p",null,"下面是网上找到的:",-1),Be=(0,a._)("p",null,[(0,a._)("strong",null,"服务器"),(0,a.Uk)(":")],-1),ze=(0,a._)("ol",null,[(0,a._)("li",null,[(0,a._)("p",null,"socketfd = socket(........); 返回一个socket文件句柄")]),(0,a._)("li",null,[(0,a._)("p",null,"设置套接字 setsockopt(socketfd , SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0) // int on =1; SO_REUSEADDR表示可以重复使用一个端口")]),(0,a._)("li",null,[(0,a._)("p",null,[(0,a.Uk)("memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = ; (端口号) "),(0,a._)("em",null,"/ addr.sin_addr.s_addr = htonl(INADDR_ANY); /"),(0,a.Uk)(" 可以监听本地的所有的ip */")])]),(0,a._)("li",null,[(0,a._)("p",null,"bind(socketfd , (struct sockaddr*)&addr, sizeof(addr)) != 0 ) // 绑定端口和IP")]),(0,a._)("li",null,[(0,a._)("p",null,"listen(socketfd , 10) != 0 /* 启动监测数据,最多可以同时连接10个客服端 */")]),(0,a._)("li",null,[(0,a._)("p",null,[(0,a.Uk)("clientfd = accept(socketfd , (struct sockaddr "),(0,a._)("em",null,")&client_addr, &addr_len); /"),(0,a.Uk)(" 等待客服端的链接,如果有链接,则建立链接 返回一个客服端的clientfd 会堵塞*/")])])],-1),Ge=(0,a._)("p",null,[(0,a._)("strong",null,"客户端"),(0,a.Uk)(":")],-1),Ke=(0,a._)("ol",null,[(0,a._)("li",null,[(0,a._)("p",null,"iSocketClient = socket(AF_INET, SOCK_DGRAM, 0); // SOCK_DGRAM 表示UDP")]),(0,a._)("li",null,[(0,a._)("p",null,"tSocketServerAddr.sin_family = AF_INET; tSocketServerAddr.sin_port = htons(端口号); /* host to net, short */ //tSocketServerAddr.sin_addr.s_addr = INADDR_ANY;")]),(0,a._)("li",null,[(0,a._)("p",null,"iRet = connect(iSocketClient, (const struct sockaddr *)&tSocketServerAddr, sizeof(struct sockaddr)); // 连接")])],-1),je=(0,a._)("p",null,"参考:https://blog.csdn.net/lgz929974811/article/details/106006925",-1),Qe=(0,a._)("h2",{id:"★-第4天",tabindex:"-1"},[(0,a._)("a",{class:"header-anchor",href:"#★-第4天","aria-hidden":"true"},"#"),(0,a.Uk)(" ★ 第4天")],-1),Xe=(0,a._)("h3",{id:"任务-编写一个tcp-client-发出一个简单的http请求",tabindex:"-1"},[(0,a._)("a",{class:"header-anchor",href:"#任务-编写一个tcp-client-发出一个简单的http请求","aria-hidden":"true"},"#"),(0,a.Uk)(" 任务:编写一个TCP Client,发出一个简单的HTTP请求")],-1),Ye=(0,a._)("p",null,"学习资料:",-1),Ze=(0,a._)("li",null,"C/C++ socket编程:《网络编程》(见附件)",-1),Ve=(0,a.Uk)("Python socket编程:"),Je={href:"https://www.cnblogs.com/george92/p/9291394.html",target:"_blank",rel:"noopener noreferrer"},$e=(0,a.Uk)("https://www.cnblogs.com/george92/p/9291394.html"),el=(0,a.Uk)("Java socket编程:"),ll={href:"https://m.runoob.com/java/java-networking.html",target:"_blank",rel:"noopener noreferrer"},nl=(0,a.Uk)("https://m.runoob.com/java/java-networking.html"),al=(0,a._)("p",null,"作业:",-1),sl=(0,a._)("p",null,"编写一个TCP Client程序,向http://www.baidu.com发起一个GET请求,并把服务器返回的数据打印出来",-1),rl=(0,a._)("p",null,[(0,a.Uk)("附件:"),(0,a._)("a",{href:"/web-server/files/day3-Linux%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B.pdf"},"Linux网络编程.pdf")],-1),tl=(0,a._)("h3",{id:"作业-3",tabindex:"-1"},[(0,a._)("a",{class:"header-anchor",href:"#作业-3","aria-hidden":"true"},"#"),(0,a.Uk)(" 作业")],-1),il=(0,a._)("p",null,"面向连接的socket的工作流程👇",-1),_l=(0,a._)("p",null,[(0,a._)("img",{src:u,alt:"day4-the-workflow-of-connection-oriented-sockets"})],-1),ul=(0,a._)("p",null,"无连接的socket工作流程👇",-1),cl=(0,a._)("p",null,[(0,a._)("img",{src:u,alt:"day4-the-workflow-of-connection-oriented-sockets"})],-1),hl=(0,a._)("h2",{id:"★-第5天",tabindex:"-1"},[(0,a._)("a",{class:"header-anchor",href:"#★-第5天","aria-hidden":"true"},"#"),(0,a.Uk)(" ★ 第5天")],-1),pl=(0,a._)("h3",{id:"任务-编写一个tcp-server-发出一个简单的http响应",tabindex:"-1"},[(0,a._)("a",{class:"header-anchor",href:"#任务-编写一个tcp-server-发出一个简单的http响应","aria-hidden":"true"},"#"),(0,a.Uk)(" 任务:编写一个TCP Server,发出一个简单的HTTP响应")],-1),ol=(0,a._)("p",null,"学习资料:同昨天相同",-1),dl=(0,a._)("p",null,"作业:",-1),bl=(0,a._)("p",null,"编写一个TCP Server程序,当收到客户发来GET请求时(先不用管请求的具体是什么),都返回一个网页,网页的内容如下:",-1),ml=(0,a._)("div",{class:"language-html ext-html line-numbers-mode"},[(0,a._)("pre",{class:"language-html"},[(0,a._)("code",null,[(0,a._)("span",{class:"token tag"},[(0,a._)("span",{class:"token tag"},[(0,a._)("span",{class:"token punctuation"},"<"),(0,a.Uk)("html")]),(0,a._)("span",{class:"token punctuation"},">")]),(0,a.Uk)("\n "),(0,a._)("span",{class:"token tag"},[(0,a._)("span",{class:"token tag"},[(0,a._)("span",{class:"token punctuation"},"<"),(0,a.Uk)("body")]),(0,a._)("span",{class:"token punctuation"},">")]),(0,a.Uk)("\n "),(0,a._)("span",{class:"token tag"},[(0,a._)("span",{class:"token tag"},[(0,a._)("span",{class:"token punctuation"},"<"),(0,a.Uk)("h1")]),(0,a._)("span",{class:"token punctuation"},">")]),(0,a.Uk)("这是我的第一个网页!"),(0,a._)("span",{class:"token tag"},[(0,a._)("span",{class:"token tag"},[(0,a._)("span",{class:"token punctuation"},"</"),(0,a.Uk)("h1")]),(0,a._)("span",{class:"token punctuation"},">")]),(0,a.Uk)("\n "),(0,a._)("span",{class:"token tag"},[(0,a._)("span",{class:"token tag"},[(0,a._)("span",{class:"token punctuation"},"</"),(0,a.Uk)("body")]),(0,a._)("span",{class:"token punctuation"},">")]),(0,a.Uk)("\n"),(0,a._)("span",{class:"token tag"},[(0,a._)("span",{class:"token tag"},[(0,a._)("span",{class:"token punctuation"},"</"),(0,a.Uk)("html")]),(0,a._)("span",{class:"token punctuation"},">")]),(0,a.Uk)("\n")])]),(0,a._)("div",{class:"line-numbers"},[(0,a._)("span",{class:"line-number"},"1"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"2"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"3"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"4"),(0,a._)("br"),(0,a._)("span",{class:"line-number"},"5"),(0,a._)("br")])],-1),kl=(0,a._)("p",null,"使用浏览器去访问自己写的这个TCP Server,截图展示访问效果",-1),gl=(0,a._)("p",null,"然后使用前一天自己编写的TCP Client去请求这个Server,通过Client将这个网页内容打印出来!",-1),Tl=(0,a._)("h3",{id:"作业-4",tabindex:"-1"},[(0,a._)("a",{class:"header-anchor",href:"#作业-4","aria-hidden":"true"},"#"),(0,a.Uk)(" 作业")],-1),Al=(0,a._)("h2",{id:"★-第8天",tabindex:"-1"},[(0,a._)("a",{class:"header-anchor",href:"#★-第8天","aria-hidden":"true"},"#"),(0,a.Uk)(" ★ 第8天")],-1),fl=(0,a._)("h3",{id:"任务-改造tcp-server-发送一个html文件",tabindex:"-1"},[(0,a._)("a",{class:"header-anchor",href:"#任务-改造tcp-server-发送一个html文件","aria-hidden":"true"},"#"),(0,a.Uk)(" 任务:改造TCP Server,发送一个HTML文件")],-1),vl=(0,a._)("p",null,"学习资料:同任务4 作业:今天的任务只有一个改动,就是将第五天任务中的TCP Server返回的那个网页内容,改为从文件中加载,而不是固定写死在代码中。",-1),wl=(0,a._)("h2",{id:"★-第9天",tabindex:"-1"},[(0,a._)("a",{class:"header-anchor",href:"#★-第9天","aria-hidden":"true"},"#"),(0,a.Uk)(" ★ 第9天")],-1),El=(0,a._)("h3",{id:"任务-使用多线程",tabindex:"-1"},[(0,a._)("a",{class:"header-anchor",href:"#任务-使用多线程","aria-hidden":"true"},"#"),(0,a.Uk)(" 任务:使用多线程")],-1),Ul=(0,a._)("p",null,"学习资料:同任务4 作业: 在原来TCP Server基础上进行改造:当服务器收到连接请求时,启动一个单独的线程进行处理。并且不要关闭连接,继续监听这个客户端后续的请求。",-1),xl=(0,a._)("p",null,[(0,a.Uk)("附件:"),(0,a._)("a",{href:"/web-server/files/day3-Linux%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B.pdf"},"Linux网络编程.pdf")],-1),Pl=(0,a._)("h3",{id:"作业-5",tabindex:"-1"},[(0,a._)("a",{class:"header-anchor",href:"#作业-5","aria-hidden":"true"},"#"),(0,a.Uk)(" 作业")],-1),Hl=(0,a._)("h2",{id:"第10天",tabindex:"-1"},[(0,a._)("a",{class:"header-anchor",href:"#第10天","aria-hidden":"true"},"#"),(0,a.Uk)(" 第10天")],-1),Wl=(0,a._)("h3",{id:"任务-设计并使用配置文件",tabindex:"-1"},[(0,a._)("a",{class:"header-anchor",href:"#任务-设计并使用配置文件","aria-hidden":"true"},"#"),(0,a.Uk)(" 任务:设计并使用配置文件")],-1),Cl=(0,a._)("p",null,"学习资料:无 作业: Web服务器一般会拥有多个参数,将服务器绑定的IP、端口、HTML文件所在的目录,写在配置文件中,程序启动的时候进行加载。",-1),Dl=(0,a._)("p",null,"需要自己设计自己的Web服务器的文件格式,可以参考JSON、XML、YML等格式",-1),Ml=(0,a._)("h3",{id:"作业-6",tabindex:"-1"},[(0,a._)("a",{class:"header-anchor",href:"#作业-6","aria-hidden":"true"},"#"),(0,a.Uk)(" 作业")],-1),Rl=(0,a._)("iframe",{src:"/web-server/files/day10-conf.json"},null,-1),Sl=(0,a._)("p",null,[(0,a._)("img",{src:c,alt:"day10-conf-image"})],-1),yl=(0,a._)("h3",{id:"作业-7",tabindex:"-1"},[(0,a._)("a",{class:"header-anchor",href:"#作业-7","aria-hidden":"true"},"#"),(0,a.Uk)(" 作业")],-1),ql=(0,a._)("h3",{id:"作业-8",tabindex:"-1"},[(0,a._)("a",{class:"header-anchor",href:"#作业-8","aria-hidden":"true"},"#"),(0,a.Uk)(" 作业")],-1),Nl=(0,a._)("h3",{id:"作业-9",tabindex:"-1"},[(0,a._)("a",{class:"header-anchor",href:"#作业-9","aria-hidden":"true"},"#"),(0,a.Uk)(" 作业")],-1),Fl=(0,a._)("h3",{id:"作业-10",tabindex:"-1"},[(0,a._)("a",{class:"header-anchor",href:"#作业-10","aria-hidden":"true"},"#"),(0,a.Uk)(" 作业")],-1),Ll=(0,a._)("hr",null,null,-1),Ol=(0,a._)("p",null,"11.29 11:01 其他人的作业",-1),Il=(0,a._)("h1",{id:"笔记",tabindex:"-1"},[(0,a._)("a",{class:"header-anchor",href:"#笔记","aria-hidden":"true"},"#"),(0,a.Uk)(" 笔记")],-1),Bl=(0,a._)("h4",{id:"回答轩辕大佬的问题",tabindex:"-1"},[(0,a._)("a",{class:"header-anchor",href:"#回答轩辕大佬的问题","aria-hidden":"true"},"#"),(0,a.Uk)(" 回答轩辕大佬的问题:")],-1),zl=(0,a._)("h5",{id:"_1-web服务器-约等于-http服务器-其他服务",tabindex:"-1"},[(0,a._)("a",{class:"header-anchor",href:"#_1-web服务器-约等于-http服务器-其他服务","aria-hidden":"true"},"#"),(0,a.Uk)(" 1.Web服务器 约等于 HTTP服务器 + 其他服务")],-1),Gl=(0,a._)("p",null,"(先不去管它这些操作具体的名称,单纯记录他的操作,后面再补) 包含:拿到数据包之后解包的东西、解析客户端的意图的东西、进行分类处理,或是提供某种文件、或是处理数据的东西、将结果装入缓冲区的东西、将以HTTP协议格式打包的东西、将该数据包推入Internet的东西",-1),Kl=(0,a._)("h5",{id:"_2-主要流程是-接收数据-⇒-http解析-⇒-逻辑处理-⇒-http封包-⇒-发送数据",tabindex:"-1"},[(0,a._)("a",{class:"header-anchor",href:"#_2-主要流程是-接收数据-⇒-http解析-⇒-逻辑处理-⇒-http封包-⇒-发送数据","aria-hidden":"true"},"#"),(0,a.Uk)(" 2.主要流程是:接收数据 ⇒ HTTP解析 ⇒ 逻辑处理 ⇒ HTTP封包 ⇒ 发送数据")],-1),jl=(0,a._)("h5",{id:"_3-用电脑画图画的-有点丑哈哈哈",tabindex:"-1"},[(0,a._)("a",{class:"header-anchor",href:"#_3-用电脑画图画的-有点丑哈哈哈","aria-hidden":"true"},"#"),(0,a.Uk)(" 3.用电脑画图画的,有点丑哈哈哈")],-1),Ql=(0,a._)("h4",{id:"其他",tabindex:"-1"},[(0,a._)("a",{class:"header-anchor",href:"#其他","aria-hidden":"true"},"#"),(0,a.Uk)(" 其他")],-1),Xl=(0,a._)("p",null,"顺便熟悉一下Markdown语法哈哈哈 稍微浏览了一下计网的书,感觉轩辕大佬的模式很好,通过项目学习,补充细节 在公众号搜到几篇文章,感觉挺有意思的,特别是有画小人的那个图解的",-1),Yl=(0,a._)("h5",{id:"网址信息收集",tabindex:"-1"},[(0,a._)("a",{class:"header-anchor",href:"#网址信息收集","aria-hidden":"true"},"#"),(0,a.Uk)(" 网址信息收集")],-1),Zl=(0,a._)("p",null,[(0,a._)("strong",null,[(0,a._)("em",null,"下面四个是一个系列的")]),(0,a.Uk)(" [# 自己动手开发一个 Web 服务器(一)](https://mp.weixin.qq.com/s/cTfLlJNpKhixk31zlvaFgg) [# 自己动手开发一个 Web 服务器(二)](https://mp.weixin.qq.com/s/2ulVC3L3w3YLcN4QS6lEvA) [# 自己动手开发一个 Web 服务器(三)《https://wx.zsxq.com/mweb/views/weread/search.html?keyword=A》](https://mp.weixin.qq.com/s/Yn_4XhwNSAuqNFGAilSmAA) [# 自己动手开发一个 Web 服务器(三)《https://wx.zsxq.com/mweb/views/weread/search.html?keyword=B》](https://mp.weixin.qq.com/s/B0CRXwKs8Z8FrW5tbEVHpg)")],-1),Vl=(0,a._)("hr",null,null,-1),Jl=(0,a._)("p",null,"[#Web服务器工作原理详解(基础篇)](https://mp.weixin.qq.com/s/eb7xOT0-2uE9caaEfAqSCg)(就是轩辕大佬发的) [# Linux下Web服务器详解](https://mp.weixin.qq.com/s/RZFQLpgjHj1V89BWyT8pQA) [# Linux | 搭建Web服务器](https://mp.weixin.qq.com/s/X6u3SBhZ7A54-uczToD9Kw) [# 来写一个属于自己的Web服务器](https://mp.weixin.qq.com/s/W5eDKKcHwlHtc-ssWOWBAg) [# 开发一个属于自己的 web 服务器](https://mp.weixin.qq.com/s/zX8JGTQ-GwC2q63UuIQKFw) [# 如何开发一个web静态服务器](https://mp.weixin.qq.com/s/H_t4jPSiBdogYVscoqUVaA) [# 开发一个 web 服务器](https://mp.weixin.qq.com/s/EoDV6g93TzKMGDV-R12jqA) [# web服务器开发之理论篇](https://mp.weixin.qq.com/s/ufQ68pdC7ZR3aI2gKZdsgw) [# 手写一个 web 服务器!](https://mp.weixin.qq.com/s/cKgoSqIk97M1M9Q-gBOLBw) [# Python 高手之路:从零开始打造一个Web服务器](https://mp.weixin.qq.com/s/3OWFXRTfhL30twQF4UzFUQ)",-1),$l=(0,a._)("p",null,"https://t.zsxq.com/YNZNRnm",-1),en={},ln=(0,n(3744).Z)(en,[["render",function(e,l){const n=(0,a.up)("OutboundLink");return(0,a.wg)(),(0,a.iD)(a.HY,null,[h,p,o,d,b,m,k,g,T,A,f,v,w,E,U,x,P,H,W,C,D,M,R,S,y,q,N,F,L,O,I,B,z,G,K,j,Q,X,Y,Z,V,J,$,ee,le,ne,ae,se,re,te,ie,_e,ue,ce,he,pe,oe,de,be,me,ke,ge,Te,Ae,fe,ve,we,Ee,Ue,xe,Pe,He,We,Ce,De,Me,Re,Se,ye,qe,Ne,Fe,Le,Oe,Ie,Be,ze,Ge,Ke,je,Qe,Xe,Ye,(0,a._)("ul",null,[Ze,(0,a._)("li",null,[Ve,(0,a._)("a",Je,[$e,(0,a.Wm)(n)])]),(0,a._)("li",null,[el,(0,a._)("a",ll,[nl,(0,a.Wm)(n)])])]),al,sl,rl,tl,il,_l,ul,cl,hl,pl,ol,dl,bl,ml,kl,gl,Tl,Al,fl,vl,wl,El,Ul,xl,Pl,Hl,Wl,Cl,Dl,Ml,Rl,Sl,yl,ql,Nl,Fl,Ll,Ol,Il,Bl,zl,Gl,Kl,jl,Ql,Xl,Yl,Zl,Vl,Jl,$l],64)}]])},3744:(e,l)=>{l.Z=(e,l)=>{const n=e.__vccOpts||e;for(const[e,a]of l)n[e]=a;return n}},3806:(e,l,n)=>{e.exports=n.p+"assets/img/day1-How-the-Web-server-works.200e1050.svg"},9698:(e,l,n)=>{e.exports=n.p+"assets/img/day10-conf-image.07fa24a3.png"},8700:(e,l,n)=>{e.exports=n.p+"assets/img/day2-HTTP-request-message.ac379a72.png"},4777:(e,l,n)=>{e.exports=n.p+"assets/img/day2-World-Wide-Web-shortcut.ae1b396c.png"},1319:(e,l,n)=>{e.exports=n.p+"assets/img/day2-trace-tcp-stream.69b2b430.png"},2214:(e,l,n)=>{e.exports=n.p+"assets/img/day2-wireshark.bc4bb754.png"},897:(e,l,n)=>{e.exports=n.p+"assets/img/day4-the-workflow-of-connection-oriented-sockets.81b480c8.png"}}]); |