1.在網(wǎng)絡(luò)邊界會(huì)對(duì)數(shù)據(jù)進(jìn)行ip地址檢測(cè),如果不是局域網(wǎng)的ip,那么路由器或者交換機(jī)就會(huì)把數(shù)據(jù)傳出局域網(wǎng)
(date 源ip,目標(biāo)ip,自己的mac地址,下一個(gè)的mac地址)通過(guò)不斷修改mac地址,從而做到網(wǎng)絡(luò)傳輸
2.osi七層參考模型
應(yīng)用層:所有能產(chǎn)生網(wǎng)絡(luò)流量的程序
表示層:數(shù)據(jù)傳輸前的壓縮、加密、確定編碼方式等操作
會(huì)話(huà)層:查看木馬(netstat -nb)(只需要網(wǎng)絡(luò)請(qǐng)求,就必定會(huì)產(chǎn)生會(huì)話(huà))
傳輸層:可靠傳輸、不可靠傳輸、流量控制
網(wǎng)絡(luò)層:負(fù)責(zé)最佳路徑,規(guī)劃ip地址
數(shù)據(jù)鏈路層:幀的開(kāi)始和結(jié)尾、透明傳輸、差錯(cuò)校驗(yàn)
物理層:接口標(biāo)準(zhǔn)、電器標(biāo)準(zhǔn)
3.tcp/ip協(xié)議棧(簇)
應(yīng)用層 http、ftp、dns
傳輸層 tcp(可靠傳輸)、udp(不可靠傳輸)
網(wǎng)絡(luò)層 arp,ip,icmp,igmp
數(shù)據(jù)鏈路層
物理層 Ethernet、ATM、FramReplay
4.數(shù)據(jù)封裝
應(yīng)用層
表示層
會(huì)話(huà)層 上層數(shù)據(jù)
傳輸層 TCP頭+上層數(shù)據(jù)
網(wǎng)絡(luò)層 IP頭+[tcp頭+上層數(shù)據(jù)] 數(shù)據(jù)包
數(shù)據(jù)鏈路層 MAC頭+[ip+tcp+上層數(shù)據(jù)]+[FCS] 數(shù)據(jù)幀
物理層 000101010101001 Bit
5.數(shù)據(jù)解封裝
應(yīng)用層
表示層 上層數(shù)據(jù)
會(huì)話(huà)層 上層數(shù)據(jù),去掉tcp頭
網(wǎng)絡(luò)層 tcp+上層數(shù)據(jù),去掉ip頭
數(shù)據(jù)鏈路層 [ip+tcp+上層數(shù)據(jù)],去掉mac頭
物理層 010101001
6.tcp/udp協(xié)議
tcp協(xié)議:傳輸控制協(xié)議,建立會(huì)話(huà),流量控制,三次握手,四次揮手
1.客戶(hù)端進(jìn)程發(fā)出連接釋放報(bào)文,并且停止發(fā)送數(shù)據(jù)。釋放數(shù)據(jù)報(bào)文首部,F(xiàn)IN=1,其序列號(hào)為seq=u(等于前面已經(jīng)傳送過(guò)來(lái)的數(shù)據(jù)的最后一個(gè)字節(jié)的序號(hào)加1),
此時(shí),客戶(hù)端進(jìn)入FIN-WAIT-1(終止等待1)狀態(tài)。 TCP規(guī)定,F(xiàn)IN報(bào)文段即使不攜帶數(shù)據(jù),也要消耗一個(gè)序號(hào)。
2.服務(wù)器收到連接釋放報(bào)文,發(fā)出確認(rèn)報(bào)文,ACK=1,ack=u+1,并且?guī)献约旱男蛄刑?hào)seq=v,此時(shí),服務(wù)端就進(jìn)入了CLOSE-WAIT(關(guān)閉等待)狀態(tài)。
TCP服務(wù)器通知高層的應(yīng)用進(jìn)程,客戶(hù)端向服務(wù)器的方向就釋放了,這時(shí)候處于半關(guān)閉狀態(tài),即客戶(hù)端已經(jīng)沒(méi)有數(shù)據(jù)要發(fā)送了,但是服務(wù)器若發(fā)送數(shù)據(jù),
客戶(hù)端依然要接受。這個(gè)狀態(tài)還要持續(xù)一段時(shí)間,也就是整個(gè)CLOSE-WAIT狀態(tài)持續(xù)的時(shí)間。
3.客戶(hù)端收到服務(wù)器的確認(rèn)請(qǐng)求后,此時(shí),客戶(hù)端就進(jìn)入FIN-WAIT-2(終止等待2)狀態(tài),
等待服務(wù)器發(fā)送連接釋放報(bào)文(在這之前還需要接受服務(wù)器發(fā)送的最后的數(shù)據(jù))。
4.服務(wù)器將最后的數(shù)據(jù)發(fā)送完畢后,就向客戶(hù)端發(fā)送連接釋放報(bào)文,F(xiàn)IN=1,ack=u+1,由于在半關(guān)閉狀態(tài),
服務(wù)器很可能又發(fā)送了一些數(shù)據(jù),假定此時(shí)的序列號(hào)為seq=w,
此時(shí),服務(wù)器就進(jìn)入了LAST-ACK(最后確認(rèn))狀態(tài),等待客戶(hù)端的確認(rèn)。
5.客戶(hù)端收到服務(wù)器的連接釋放報(bào)文后,必須發(fā)出確認(rèn),ACK=1,ack=w+1,
而自己的序列號(hào)是seq=u+1,此時(shí),客戶(hù)端就進(jìn)入了TIME-WAIT(時(shí)間等待)
狀態(tài)。注意此時(shí)TCP連接還沒(méi)有釋放,必須經(jīng)過(guò)2?MSL(最長(zhǎng)報(bào)文段壽命)的時(shí)間后,當(dāng)客戶(hù)端撤銷(xiāo)相應(yīng)的TCB后,
才進(jìn)入CLOSED狀態(tài)。
6.服務(wù)器只要收到了客戶(hù)端發(fā)出的確認(rèn),立即進(jìn)入CLOSED狀態(tài)。同樣,撤銷(xiāo)TCB后,
就結(jié)束了這次的TCP連接??梢钥吹?,服務(wù)器結(jié)束TCP連接的時(shí)間要比客戶(hù)端早一些。
udp:用戶(hù)數(shù)據(jù)報(bào)協(xié)議,不可靠傳輸,不建立會(huì)話(huà),沒(méi)有流量控制
文件分段傳輸,可以使用容器把每一段裝起來(lái),傳輸完成在寫(xiě)入硬盤(pán)中
7.url:統(tǒng)一資源定位符
url基本格式:協(xié)議://主機(jī)地址/路徑1
8.url中常見(jiàn)的協(xié)議
http:超文本傳輸協(xié)議,訪問(wèn)的是遠(yuǎn)程的網(wǎng)絡(luò)資源,規(guī)定客戶(hù)端和服務(wù)器之間的數(shù)據(jù)傳輸格式
file:訪問(wèn)的是本地計(jì)算機(jī)的資源,格式是:file://
mailto:訪問(wèn)的是電子郵件地址,格式是mailto:
ftp:文件傳輸協(xié)議,格式是ftp://
http協(xié)議的特點(diǎn):
簡(jiǎn)單快速
http協(xié)議簡(jiǎn)單,http服務(wù)器規(guī)模小
靈活
http允許傳輸各種各樣的數(shù)據(jù)
http0.9和1.0使用的非持續(xù)連接
HTTP協(xié)議的基本通信過(guò)程
1.請(qǐng)求request
請(qǐng)求頭:包含了對(duì)客戶(hù)端環(huán)境的描述,客戶(hù)端請(qǐng)求信息等
GET /minion.png HTTP/1.1 //包含了請(qǐng)求方法、請(qǐng)求資源路徑,http協(xié)議版本
Host:120.25.226.186:32812 //客戶(hù)端想要訪問(wèn)的主機(jī)地址
User-Agent:Mozilla/5.0 //客戶(hù)端的類(lèi)型,客戶(hù)端的軟件環(huán)境
Accept:text/html,/ //客戶(hù)端能接受到的數(shù)據(jù)類(lèi)型
Accept_language:zh-cn //客戶(hù)端的語(yǔ)言環(huán)境
Accept-Encoding:gzip //客戶(hù)端支持的數(shù)據(jù)壓縮格式
請(qǐng)求體:要傳輸?shù)臄?shù)據(jù)
2.響應(yīng)response
響應(yīng)頭:包含了對(duì)服務(wù)的描述,對(duì)返回?cái)?shù)據(jù)的描述
HTTP/1.1 200 OK //包含了HTTP協(xié)議版本、狀態(tài)碼、狀態(tài)英文
Server:Apache-Coyote/1.1 服務(wù)器類(lèi)型
Content-Type: 返回的數(shù)據(jù)類(lèi)型
Content-length: 返回的數(shù)據(jù)長(zhǎng)度
Data: 響應(yīng)的時(shí)間
響應(yīng)體:響應(yīng)的具體的數(shù)據(jù)
http請(qǐng)求的方法
GET,POST,OPTIONS,HEAD,PUT,DELETE,TRACE,CONNECT,PATCH
get:在請(qǐng)求的url后面加上?將數(shù)據(jù)拼接到url上,url大小不能超過(guò)1KB
post:沒(méi)限制
9.socket套接字服務(wù)端
# socket:套接字,就是進(jìn)行數(shù)據(jù)通信的兩端。分為服務(wù)端套接字和客戶(hù)端套接字
# 套接字編程:自己寫(xiě)服務(wù)器或者客戶(hù)端,進(jìn)行數(shù)據(jù)傳輸
# python對(duì)socket套接字的支持:提供了一個(gè)socket的庫(kù)(內(nèi)置)
import socket
def create_server():
'''
寫(xiě)服務(wù)器套接字
'''
# 1.創(chuàng)建套接字對(duì)象
'''
socket(family=socket.AF_INET,type=socket.SOCK_STRING)
family:是用來(lái)確定ip協(xié)議類(lèi)型的,
AF_INET對(duì)應(yīng)的是ipv4 (默認(rèn))
AF_INET6對(duì)應(yīng)的是ipv6
type:傳輸協(xié)議的類(lèi)型
SOCK_STRING:對(duì)應(yīng)的是TCP協(xié)議 (默認(rèn))
SOCK_DGRAM:對(duì)應(yīng)的是UDP協(xié)議
'''
server = socket.socket()
#2.需要綁定ip地址和端口
'''
bind((ip地址,端口))
端口:一臺(tái)電腦上一個(gè)端口標(biāo)記一個(gè)唯一的服務(wù)。范圍0-65535,,0~1024是著名端口,專(zhuān)門(mén)用來(lái)標(biāo)記一些特殊服務(wù),一般不要用
注意:通一個(gè)端口,同一時(shí)間只能綁定一個(gè)服務(wù)
'''
server.bind(('10.7.153.191',8080))
#3.監(jiān)聽(tīng)(監(jiān)聽(tīng)客戶(hù)端的請(qǐng)求)
'''
listen(并發(fā)連接最大個(gè)數(shù))
'''
server.listen(5)
#4.讓服務(wù)器處于運(yùn)行狀態(tài)
#5.連接客戶(hù)端(建立連接),返回連接對(duì)象和客戶(hù)端地址
connect,addr= server.accept() #程序執(zhí)行到這兒會(huì)阻塞線(xiàn)程,直到有客戶(hù)端來(lái)請(qǐng)求當(dāng)前服務(wù)器為止
#6.服務(wù)器給客戶(hù)端發(fā)生消息
'''
send(數(shù)據(jù))
data:這兒的參數(shù)要求類(lèi)型是bytes(python3),python2可以傳送字符串
字符串str和二進(jìn)制bytes之間的轉(zhuǎn)換
1.字符串提供的方法
符串.encode('編碼方式'),默認(rèn)編碼是utf-8
2.類(lèi)型名()
bytes(字符串,encoding=None)
'''
while True:
message = bytes(input('server:'),'utf-8')
connect.send(message)
#7.接受從客戶(hù)端傳過(guò)來(lái)的消息
'''
recv(bufsize)
bufsize:每次能夠接收的最大的字節(jié)數(shù)
返回值:接收到的數(shù)據(jù),類(lèi)型是bytes類(lèi)型
二進(jìn)制轉(zhuǎn)換成字符串:
1.二進(jìn)制.decode(編碼方式)方法,默認(rèn)utf-8
2.str(二進(jìn)制,編碼方式),編碼方式必須書(shū)寫(xiě)
'''
recv_data = connect.recv(1024)#recv()方法也會(huì)阻塞線(xiàn)程
print('client:'+str(recv_data,'utf-8'))
#8.斷開(kāi)連接
connect.close()
if __name__ == '__main__':
create_server()
10.socket套接字客戶(hù)端
import socket
def create_client():
#1.創(chuàng)建套接字對(duì)象
client = socket.socket()
#2.連接服務(wù)器
'''
connect(('10.7.153.191',8080))
服務(wù)器地址:(ip,端口)
'''
client.connect(('10.7.153.104',8080))
while True:
#3.接收服務(wù)器發(fā)送的數(shù)據(jù)
recv_data = client.recv(1024)
print('server:'+recv_data.decode())
#4.給服務(wù)器發(fā)送消息
message =bytes(input('client:'),'utf-8')
client.send(message)
if message == 0:
break
#5.端口連接
client.close()
if __name__ == '__main__':
create_client()
11.request請(qǐng)求與響應(yīng)
import requests
if __name__ == '__main__':
# 1.準(zhǔn)備url
url = 'https://www.apiopen.top/satinApi?type=1&page=1'
# 2.發(fā)送請(qǐng)求(GET請(qǐng)求),返回值就是服務(wù)器返回的響應(yīng)
'''
post(url,{參數(shù)對(duì)應(yīng)的字典})
get(url,{參數(shù)對(duì)應(yīng)的字典})
'''
response = requests.get(url)
# requests.get('https://www.apiopen.top/satinApi',{'type':1,'page':1})
#3.通過(guò)響應(yīng)獲取服務(wù)器返回的數(shù)據(jù)
#a.獲取字符串類(lèi)型的數(shù)據(jù)
print(response.text)
#b.獲取json格式的數(shù)據(jù)
print(response.json())
#c.獲取二進(jìn)制格式的數(shù)據(jù)
print(response.content)
#4.獲取響應(yīng)頭
print(response.headers)