服务器无法在发送 http 标头之后设置内容类型。_python socket编程预知内容
socket:運(yùn)用IP地址+協(xié)議+端口 標(biāo)識(shí)一個(gè)進(jìn)程
我們知道兩個(gè)進(jìn)程如果需要進(jìn)行通訊最基本的一個(gè)前提能能夠唯一的標(biāo)示一個(gè)進(jìn)程, 在本地進(jìn)程通訊中我們可以使用PID來(lái)唯一標(biāo)示一個(gè)進(jìn)程,但PID只在本地唯一,網(wǎng)絡(luò)中的兩個(gè)進(jìn)程PID沖突幾率很大 ,這時(shí)候我們需要另辟它徑了,我們知道IP層的ip地址可以唯一標(biāo)示主機(jī),而TCP層協(xié)議和端口號(hào)可以唯一標(biāo)示主機(jī) 的一個(gè)進(jìn)程,這樣我們可以利用ip地址+協(xié)議+端口號(hào)唯一標(biāo)示網(wǎng)絡(luò)中的一個(gè)進(jìn)程要想進(jìn)程進(jìn)行通訊,要給這兩個(gè)進(jìn)程,分別做一個(gè)唯一的標(biāo)記
- socket: 被標(biāo)識(shí)的進(jìn)程,能利用socket進(jìn)行網(wǎng)絡(luò)通信了。
- socket是在應(yīng)用層和傳輸層之間的一個(gè)抽象層
- 把TCP/IP層復(fù)雜的操作,
- 抽象為幾個(gè)簡(jiǎn)單的接口,
- 供應(yīng)用層調(diào)用已實(shí)現(xiàn)進(jìn)程在網(wǎng)絡(luò)中通信。
網(wǎng)絡(luò)通信實(shí)現(xiàn):
網(wǎng)絡(luò)通信duan機(jī)需具備四要素本機(jī)的IP地址 子網(wǎng)掩碼 網(wǎng)關(guān)的IP地址 DNS的IP地址 獲取這四要素分兩種方式1.靜態(tài)獲取 即手動(dòng)配置 2.動(dòng)態(tài)獲取 通過dhcp獲取以太網(wǎng)頭 ip頭 udp頭 dhcp數(shù)據(jù)包(1)最前面的”以太網(wǎng)標(biāo)頭”,設(shè)置發(fā)出方(本機(jī))的MAC地址和接收方(DHCP服務(wù)器)的MAC地址。 前者就是本機(jī)網(wǎng)卡的MAC地址,后者這時(shí)不知道,就填入一個(gè)廣播地址:FF-FF-FF-FF-FF-FF。 (2)后面的”IP標(biāo)頭”,設(shè)置發(fā)出方的IP地址和接收方的IP地址。這時(shí),對(duì)于這兩者,本機(jī)都不知道。 于是,發(fā)出方的IP地址就設(shè)為0.0.0.0,接收方的IP地址設(shè)為255.255.255.255。 (3)最后的”UDP標(biāo)頭”,設(shè)置發(fā)出方的端口和接收方的端口。這一部分是DHCP協(xié)議規(guī)定好的,發(fā)出方是68端口, 接收方是67端口。 1.以太網(wǎng)標(biāo)頭: 設(shè)置 本機(jī)MAC地址 服務(wù)器MAC地址 2.IP標(biāo)頭 : 設(shè)置 本機(jī)IP地址 服務(wù)器IP地址 3.UDP標(biāo)頭:設(shè)置 本機(jī)端口 服務(wù)器端口這個(gè)數(shù)據(jù)包構(gòu)造完成后,就可以發(fā)出了。以太網(wǎng)是廣播發(fā)送,同一個(gè)子網(wǎng)絡(luò)的每臺(tái)計(jì)算機(jī)都收到了這個(gè)包。 因?yàn)榻邮辗降腗AC地址是FF-FF-FF-FF-FF-FF,看不出是發(fā)給誰(shuí)的,所以每臺(tái)收到這個(gè)包的計(jì)算機(jī),還必須分析 這個(gè)包的IP地址,才能確定是不是發(fā)給自己的。當(dāng)看到發(fā)出方IP地址是0.0.0.0,接收方是255.255.255.255, 于是DHCP服務(wù)器知道”這個(gè)包是發(fā)給我的”,而其他計(jì)算機(jī)就可以丟棄這個(gè)包。 ===========================================================================接下來(lái),DHCP服務(wù)器讀出這個(gè)包的數(shù)據(jù)內(nèi)容,分配好IP地址,發(fā)送回去一個(gè)”DHCP響應(yīng)”數(shù)據(jù)包。 這個(gè)響應(yīng)包的結(jié)構(gòu)也是類似的,以太網(wǎng)標(biāo)頭的MAC地址是雙方的網(wǎng)卡地址,IP標(biāo)頭的IP地址是DHCP服務(wù)器的IP地址 (發(fā)出方)和255.255.255.255(接收方),UDP標(biāo)頭的端口是67(發(fā)出方)和68(接收方), 分配給請(qǐng)求端的IP地址和本網(wǎng)絡(luò)的具體參數(shù)則包含在Data部分。新加入的計(jì)算機(jī)收到這個(gè)響應(yīng)包,于是就知道了自己的IP地址、子網(wǎng)掩碼、網(wǎng)關(guān)地址、DNS服務(wù)器等等參數(shù)網(wǎng)絡(luò)通信流程:一下內(nèi)容均摘自我的老師的博客
1.本機(jī)獲取
- 本機(jī)的IP地址:192.168.1.100
- 子網(wǎng)掩碼:255.255.255.0
- 網(wǎng)關(guān)的IP地址:192.168.1.1
- DNS的IP地址:8.8.8.8
2.打開瀏覽器,想要訪問Google,在地址欄輸入了網(wǎng)址:http://www.google.com。
3.dns協(xié)議(基于udp協(xié)議)
13臺(tái)根dns:
A.root-servers.net198.41.0.4美國(guó)
B.root-servers.net192.228.79.201美國(guó)(另支持IPv6)
C.root-servers.net192.33.4.12法國(guó)
D.root-servers.net128.8.10.90美國(guó)
E.root-servers.net192.203.230.10美國(guó)
F.root-servers.net192.5.5.241美國(guó)(另支持IPv6)
G.root-servers.net192.112.36.4美國(guó)
H.root-servers.net128.63.2.53美國(guó)(另支持IPv6)
I.root-servers.net192.36.148.17瑞典
J.root-servers.net192.58.128.30美國(guó)
K.root-servers.net193.0.14.129英國(guó)(另支持IPv6)
L.root-servers.net198.32.64.12美國(guó)
M.root-servers.net202.12.27.33日本(另支持IPv6)
域名定義:http://jingyan.baidu.com/article/1974b289a649daf4b1f774cb.html
頂級(jí)域名:以.com,.net,.org,.cn等等屬于國(guó)際頂級(jí)域名,根據(jù)目前的國(guó)際互聯(lián)網(wǎng)域名體系,國(guó)際頂級(jí)域名分為兩類:類別頂級(jí)域名(gTLD)和地理頂級(jí)域名(ccTLD)兩種。類別頂級(jí)域名是 以"COM"、"NET"、"ORG"、"BIZ"、"INFO"等結(jié)尾的域名,均由國(guó)外公司負(fù)責(zé)管理。地理頂級(jí)域名是以國(guó)家或地區(qū)代碼為結(jié)尾的域名,如"CN"代表中國(guó),"UK"代表英國(guó)。地理頂級(jí)域名一般由各個(gè)國(guó)家或地區(qū)負(fù)責(zé)管理。
二級(jí)域名:二級(jí)域名是以頂級(jí)域名為基礎(chǔ)的地理域名,比喻中國(guó)的二級(jí)域有,.com.cn,.net.cn,.org.cn,.http://gd.cn等.子域名是其父域名的子域名,比喻父域名是abc.com,子域名就是http://www.abc.com或者*.abc.com.
一般來(lái)說,二級(jí)域名是域名的一條記錄,比如http://alidiedie.com是一個(gè)域名,http://www.alidiedie.com是其中比較常用的記錄,一般默認(rèn)是用這個(gè),但是類似*.http://alidiedie.com的域名全部稱作是http://alidiedie.com的二級(jí)
4.HTTP部分的內(nèi)容,類似于下面這樣:
GET / HTTP/1.1Host: http://www.google.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.1) ……
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8
Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3
Cookie: … …
我們假定這個(gè)部分的長(zhǎng)度為4960字節(jié),它會(huì)被嵌在TCP數(shù)據(jù)包之中。
5 TCP協(xié)議
TCP數(shù)據(jù)包需要設(shè)置端口,接收方(Google)的HTTP端口默認(rèn)是80,發(fā)送方(本機(jī))的端口是一個(gè)隨機(jī)生成的1024-65535之間的整數(shù),假定為51775。
TCP數(shù)據(jù)包的標(biāo)頭長(zhǎng)度為20字節(jié),加上嵌入HTTP的數(shù)據(jù)包,總長(zhǎng)度變?yōu)?980字節(jié)。
6 IP協(xié)議
然后,TCP數(shù)據(jù)包再嵌入IP數(shù)據(jù)包。IP數(shù)據(jù)包需要設(shè)置雙方的IP地址,這是已知的,發(fā)送方是192.168.1.100(本機(jī)),接收方是172.194.72.105(Google)。
IP數(shù)據(jù)包的標(biāo)頭長(zhǎng)度為20字節(jié),加上嵌入的TCP數(shù)據(jù)包,總長(zhǎng)度變?yōu)?000字節(jié)。
7 以太網(wǎng)協(xié)議
最后,IP數(shù)據(jù)包嵌入以太網(wǎng)數(shù)據(jù)包。以太網(wǎng)數(shù)據(jù)包需要設(shè)置雙方的MAC地址,發(fā)送方為本機(jī)的網(wǎng)卡MAC地址,接收方為網(wǎng)關(guān)192.168.1.1的MAC地址(通過ARP協(xié)議得到)。
以太網(wǎng)數(shù)據(jù)包的數(shù)據(jù)部分,最大長(zhǎng)度為1500字節(jié),而現(xiàn)在的IP數(shù)據(jù)包長(zhǎng)度為5000字節(jié)。因此,IP數(shù)據(jù)包必須分割成四個(gè)包。因?yàn)槊總€(gè)包都有自己的IP標(biāo)頭(20字節(jié)),所以四個(gè)包的IP數(shù)據(jù)包的長(zhǎng)度分別為1500、1500、1500、560。
8 服務(wù)器端響應(yīng)
經(jīng)過多個(gè)網(wǎng)關(guān)的轉(zhuǎn)發(fā),Google的服務(wù)器172.194.72.105,收到了這四個(gè)以太網(wǎng)數(shù)據(jù)包。
根據(jù)IP標(biāo)頭的序號(hào),Google將四個(gè)包拼起來(lái),取出完整的TCP數(shù)據(jù)包,然后讀出里面的”HTTP請(qǐng)求”,接著做出”HTTP響應(yīng)”,再用TCP協(xié)議發(fā)回來(lái)。
本機(jī)收到HTTP響應(yīng)以后,就可以將網(wǎng)頁(yè)顯示出來(lái),完成一次網(wǎng)絡(luò)通信。
總結(jié)
以上是生活随笔為你收集整理的服务器无法在发送 http 标头之后设置内容类型。_python socket编程预知内容的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle最快访问行,Oracle技术
- 下一篇: 人工智能只能用python吗_为什么人工