day18_python_網絡基礎

1.在網絡邊界會對數據進行ip地址檢測,如果不是局域網的ip,那么路由器或者交換機就會把數據傳出局域網

(date 源ip,目標ip,自己的mac地址,下一個的mac地址)通過不斷修改mac地址,從而做到網絡傳輸

2.osi七層參考模型

應用層:所有能產生網絡流量的程序
表示層:數據傳輸前的壓縮、加密、確定編碼方式等操作
會話層:查看木馬(netstat -nb)(只需要網絡請求,就必定會產生會話)
傳輸層:可靠傳輸、不可靠傳輸、流量控制
網絡層:負責最佳路徑,規(guī)劃ip地址
數據鏈路層:幀的開始和結尾、透明傳輸、差錯校驗
物理層:接口標準、電器標準

3.tcp/ip協(xié)議棧(簇)

應用層 http、ftp、dns
傳輸層 tcp(可靠傳輸)、udp(不可靠傳輸)
網絡層 arp,ip,icmp,igmp

數據鏈路層
物理層 Ethernet、ATM、FramReplay

4.數據封裝

應用層
表示層
會話層 上層數據
傳輸層 TCP頭+上層數據
網絡層 IP頭+[tcp頭+上層數據] 數據包
數據鏈路層 MAC頭+[ip+tcp+上層數據]+[FCS] 數據幀
物理層 000101010101001 Bit

5.數據解封裝

應用層
表示層 上層數據
會話層 上層數據,去掉tcp頭
網絡層 tcp+上層數據,去掉ip頭
數據鏈路層 [ip+tcp+上層數據],去掉mac頭
物理層 010101001

6.tcp/udp協(xié)議

tcp協(xié)議:傳輸控制協(xié)議,建立會話,流量控制,三次握手,四次揮手
1.客戶端進程發(fā)出連接釋放報文,并且停止發(fā)送數據。釋放數據報文首部,F(xiàn)IN=1,其序列號為seq=u(等于前面已經傳送過來的數據的最后一個字節(jié)的序號加1),
此時,客戶端進入FIN-WAIT-1(終止等待1)狀態(tài)。 TCP規(guī)定,F(xiàn)IN報文段即使不攜帶數據,也要消耗一個序號。

2.服務器收到連接釋放報文,發(fā)出確認報文,ACK=1,ack=u+1,并且?guī)献约旱男蛄刑杝eq=v,此時,服務端就進入了CLOSE-WAIT(關閉等待)狀態(tài)。
TCP服務器通知高層的應用進程,客戶端向服務器的方向就釋放了,這時候處于半關閉狀態(tài),即客戶端已經沒有數據要發(fā)送了,但是服務器若發(fā)送數據,
客戶端依然要接受。這個狀態(tài)還要持續(xù)一段時間,也就是整個CLOSE-WAIT狀態(tài)持續(xù)的時間。
3.客戶端收到服務器的確認請求后,此時,客戶端就進入FIN-WAIT-2(終止等待2)狀態(tài),
等待服務器發(fā)送連接釋放報文(在這之前還需要接受服務器發(fā)送的最后的數據)。
4.服務器將最后的數據發(fā)送完畢后,就向客戶端發(fā)送連接釋放報文,F(xiàn)IN=1,ack=u+1,由于在半關閉狀態(tài),
服務器很可能又發(fā)送了一些數據,假定此時的序列號為seq=w,
此時,服務器就進入了LAST-ACK(最后確認)狀態(tài),等待客戶端的確認。
5.客戶端收到服務器的連接釋放報文后,必須發(fā)出確認,ACK=1,ack=w+1,
而自己的序列號是seq=u+1,此時,客戶端就進入了TIME-WAIT(時間等待)
狀態(tài)。注意此時TCP連接還沒有釋放,必須經過2?MSL(最長報文段壽命)的時間后,當客戶端撤銷相應的TCB后,
才進入CLOSED狀態(tài)。
6.服務器只要收到了客戶端發(fā)出的確認,立即進入CLOSED狀態(tài)。同樣,撤銷TCB后,
就結束了這次的TCP連接??梢钥吹剑掌鹘Y束TCP連接的時間要比客戶端早一些。
udp:用戶數據報協(xié)議,不可靠傳輸,不建立會話,沒有流量控制

文件分段傳輸,可以使用容器把每一段裝起來,傳輸完成在寫入硬盤中

7.url:統(tǒng)一資源定位符

url基本格式:協(xié)議://主機地址/路徑1

8.url中常見的協(xié)議

http:超文本傳輸協(xié)議,訪問的是遠程的網絡資源,規(guī)定客戶端和服務器之間的數據傳輸格式
file:訪問的是本地計算機的資源,格式是:file://
mailto:訪問的是電子郵件地址,格式是mailto:
ftp:文件傳輸協(xié)議,格式是ftp://

http協(xié)議的特點:
簡單快速
http協(xié)議簡單,http服務器規(guī)模小

靈活
http允許傳輸各種各樣的數據

http0.9和1.0使用的非持續(xù)連接
HTTP協(xié)議的基本通信過程
1.請求request
請求頭:包含了對客戶端環(huán)境的描述,客戶端請求信息等
GET /minion.png HTTP/1.1 //包含了請求方法、請求資源路徑,http協(xié)議版本
Host:120.25.226.186:32812 //客戶端想要訪問的主機地址
User-Agent:Mozilla/5.0 //客戶端的類型,客戶端的軟件環(huán)境
Accept:text/html,/ //客戶端能接受到的數據類型
Accept_language:zh-cn //客戶端的語言環(huán)境
Accept-Encoding:gzip //客戶端支持的數據壓縮格式

請求體:要傳輸的數據
2.響應response
響應頭:包含了對服務的描述,對返回數據的描述
HTTP/1.1 200 OK //包含了HTTP協(xié)議版本、狀態(tài)碼、狀態(tài)英文
Server:Apache-Coyote/1.1 服務器類型
Content-Type: 返回的數據類型
Content-length: 返回的數據長度
Data: 響應的時間
響應體:響應的具體的數據

http請求的方法
GET,POST,OPTIONS,HEAD,PUT,DELETE,TRACE,CONNECT,PATCH

get:在請求的url后面加上?將數據拼接到url上,url大小不能超過1KB
post:沒限制

9.socket套接字服務端

# socket:套接字,就是進行數據通信的兩端。分為服務端套接字和客戶端套接字
# 套接字編程:自己寫服務器或者客戶端,進行數據傳輸
# python對socket套接字的支持:提供了一個socket的庫(內置)

import socket

def create_server():
    '''
    寫服務器套接字
    '''
#     1.創(chuàng)建套接字對象
    '''
    socket(family=socket.AF_INET,type=socket.SOCK_STRING)
    family:是用來確定ip協(xié)議類型的,
        AF_INET對應的是ipv4 (默認)
        AF_INET6對應的是ipv6
    type:傳輸協(xié)議的類型
        SOCK_STRING:對應的是TCP協(xié)議 (默認)
        SOCK_DGRAM:對應的是UDP協(xié)議
    '''
    server =  socket.socket()
    #2.需要綁定ip地址和端口
    '''
    bind((ip地址,端口))
        端口:一臺電腦上一個端口標記一個唯一的服務。范圍0-65535,,0~1024是著名端口,專門用來標記一些特殊服務,一般不要用
        注意:通一個端口,同一時間只能綁定一個服務
    '''
    server.bind(('10.7.153.191',8080))
    
    #3.監(jiān)聽(監(jiān)聽客戶端的請求)
    '''
    listen(并發(fā)連接最大個數)
    '''
    server.listen(5)
    #4.讓服務器處于運行狀態(tài)

        #5.連接客戶端(建立連接),返回連接對象和客戶端地址
    connect,addr= server.accept()   #程序執(zhí)行到這兒會阻塞線程,直到有客戶端來請求當前服務器為止
        
    #6.服務器給客戶端發(fā)生消息
    '''
    send(數據)
    data:這兒的參數要求類型是bytes(python3),python2可以傳送字符串
            字符串str和二進制bytes之間的轉換
     1.字符串提供的方法
                符串.encode('編碼方式'),默認編碼是utf-8
                2.類型名()
                bytes(字符串,encoding=None)
        '''
        
    while True:
        message = bytes(input('server:'),'utf-8')
        connect.send(message)
        #7.接受從客戶端傳過來的消息
        '''
        recv(bufsize)
        bufsize:每次能夠接收的最大的字節(jié)數
                    返回值:接收到的數據,類型是bytes類型
                    
                    二進制轉換成字符串:
                    1.二進制.decode(編碼方式)方法,默認utf-8
                    2.str(二進制,編碼方式),編碼方式必須書寫
        '''
        recv_data = connect.recv(1024)#recv()方法也會阻塞線程
        print('client:'+str(recv_data,'utf-8'))
        
        #8.斷開連接
    connect.close()
        
if __name__ == '__main__':
    create_server()

10.socket套接字客戶端

import socket
def create_client():
    #1.創(chuàng)建套接字對象
    client = socket.socket()
    #2.連接服務器
    '''
    connect(('10.7.153.191',8080))
         服務器地址:(ip,端口)
    '''
    client.connect(('10.7.153.104',8080))
    while True:
       
        #3.接收服務器發(fā)送的數據
        recv_data = client.recv(1024)
        print('server:'+recv_data.decode())
        #4.給服務器發(fā)送消息
        message =bytes(input('client:'),'utf-8')
        client.send(message)
        if message == 0:
            break
    
    #5.端口連接
    client.close()
if __name__ == '__main__':
    create_client()

11.request請求與響應

import requests
 

if __name__ == '__main__':
#     1.準備url
    url = 'https://www.apiopen.top/satinApi?type=1&page=1'
#     2.發(fā)送請求(GET請求),返回值就是服務器返回的響應
    '''
    post(url,{參數對應的字典})
    get(url,{參數對應的字典})
    '''
    response = requests.get(url)
    
#     requests.get('https://www.apiopen.top/satinApi',{'type':1,'page':1})
    #3.通過響應獲取服務器返回的數據
    #a.獲取字符串類型的數據
    print(response.text)
    #b.獲取json格式的數據
    print(response.json())
    #c.獲取二進制格式的數據
    print(response.content)
    
    #4.獲取響應頭
    print(response.headers)
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 1、TCP為什么需要3次握手,4次斷開? “三次握手”的目的是“為了防止已失效的連接請求報文段突然又傳送到了服務端...
    杰倫哎呦哎呦閱讀 3,670評論 0 6
  • 1.這篇文章不是本人原創(chuàng)的,只是個人為了對這部分知識做一個整理和系統(tǒng)的輸出而編輯成的,在此鄭重地向本文所引用文章的...
    SOMCENT閱讀 13,393評論 6 174
  • title: 網絡基礎學習總結(1) tags: 網絡 categories:筆記 date: 2017-06-1...
    行徑行閱讀 2,760評論 0 3
  • 當 app 和服務器進行通信的時候,大多數情況下,都是采用 HTTP 協(xié)議。HTTP 最初是為 web 瀏覽器而定...
    Flysss1219閱讀 1,447評論 0 4
  • 個人認為,Goodboy1881先生的TCP /IP 協(xié)議詳解學習博客系列博客是一部非常精彩的學習筆記,這雖然只是...
    貳零壹柒_fc10閱讀 5,216評論 0 8

友情鏈接更多精彩內容