網絡編程--1

1、TCP/IP協議簇服務器

  早期的計算機⽹絡,都是由各⼚商⾃⼰規定⼀套協議,IBM、Apple和 Microsoft都有各⾃的⽹絡協議,互不兼容
  爲了把全世界的全部不一樣類型的計算機都鏈接起來,就必須規定⼀套全球通 ⽤的協議,爲了實現互聯⽹這個⽬標,互聯⽹協議簇(Internet Protocol Suite)就是通⽤協議標準。
  由於互聯⽹協議包含了上百種協議標準,可是最重要的兩個協議是TCP和IP 協議,因此,⼤家把互聯⽹的協議簡稱TCP/IP協議網絡

 

   按4層劃分:鏈路層,網絡層,傳輸層,應用層多線程

   按7層劃分:物理層,數據鏈路層,網絡層,傳輸層,會話層,表示層,應用層socket

2、端口測試

  1.端口號ui

    端口是經過端口號來標記的,端口號只有整數。範圍是從0到65535spa

  2.知名端口線程

    範圍:0-10233d

    80端口分配給HTTPcode

    21端口分配給FTP

  3.動態端口

    範圍:1024-65535

     之因此稱爲動態端⼝,是由於它⼀般不固定分配某種服務,⽽是動態分配。

     動態分配是指當⼀個系統進程或應⽤程序進程須要⽹絡通訊時,它向主機申 請⼀個端⼝,主機從可⽤的端⼝號中分配⼀個供它使⽤。

    當這個進程關閉時,同時也就釋放了所佔⽤的端⼝號。

3、IP地址

  1.A類IP地址:

    ⼀個A類IP地址由1字節的⽹絡地址和3字節主機地址組成,⽹絡地址的最⾼ 位必須是「0」,
    地址範圍1.0.0.1-126.255.255.254
    ⼆進製表示爲:00000001 00000000 00000000 00000001 - 01111110 11111111 11111111 11111110
    可⽤的A類⽹絡有126個,每一個⽹絡能容納1677214個主機

  2.B類IP地址:

    ⼀個B類IP地址由2個字節的⽹絡地址和2個字節的主機地址組成,⽹絡地址 的最⾼位必須是「10」,
    地址範圍128.1.0.1-191.255.255.254
    ⼆進製表示爲:10000000 00000001 00000000 00000001 - 10111111 11111111 11111111 11111110
    可⽤的B類⽹絡有16384個,每一個⽹絡能容納65534主機

  3.C類IP地址:

    ⼀個C類IP地址由3字節的⽹絡地址和1字節的主機地址組成,⽹絡地址的最 ⾼位必須是「110」
    範圍192.0.1.1-223.255.255.254
    ⼆進製表示爲: 11000000 00000000 00000001 00000001 - 11011111 11111111 11111110 11111110
    C類⽹絡可達2097152個,每一個⽹絡能容納254個主機

  4.D類IP地址:(用於多點廣播)

    D類IP地址第⼀個字節以「1110」開始,它是⼀個專⻔保留的地址。
    它並不指向特定的⽹絡,⽬前這⼀類地址被⽤在多點⼴播(Multicast)中
    多點⼴播地址⽤來⼀次尋址⼀組計算機
    地址範圍224.0.0.1-239.255.255.254

  5.E類IP地址:

    以「1111」開始,爲未來使⽤保留
    E類地址保留,僅做實驗和開發⽤

  6.私有IP

    10.0.0.0~10.255.255.255
    172.16.0.0~172.31.255.255
    192.168.0.0~192.168.255.255

  7.注意

    IP地址127.0.0.1~127.255.255.255⽤於迴路測試,
  如:127.0.0.1能夠表明本機IP地址,⽤ http://127.0.0.1 就能夠測試本機 中配置的Web服務器。

4、socket

    socket(簡稱 套接字 ) 是進程間通訊的⼀種⽅式

  1.建立socket

  UDP:SOCK_DGRAM

  TCP:SOCK_STREAM

import socket

s = socket.socket(socket.AF_IFET,socket.SOCK_STREAM/SOCK_DGRAM)

print = (Socket Created)

5、UDP

  UDP是⾯向⽆鏈接的通信協議,UDP數據包括⽬的端⼝號和源端⼝號信息, 因爲通信不須要鏈接,因此能夠實現⼴播發送。 UDP傳輸數據時有⼤⼩限 制,每一個被傳輸的數據報必須限定在64KB以內。 UDP是⼀個不可靠的協 議,發送⽅所發送的數據報並不⼀定以相同的次序到達接收⽅。

  1.udp網絡程序--發送數據

from socket import *
#1.建立套接字 
udpSocket = socket(AF_INET,SOCK_DGRAM)
#2.準備接收⽅的地址 
sendAddr = ('192.168.1.103',8080)
#3.從鍵盤獲取數據 
sendData =raw_input("請輸⼊要發送的數據:")
#4.發送數據到指定的電腦上 
udpSocket.sendto(sendData,sendAddr)
#5.關閉套接字 
udpSocket.close()

  2.udp網絡程序--接收數據

#coding=utf-8
from socket import *
#1.建立套接字
udpSocket=socket(AF_INET,SOCK_DGRAM)
#2.準備接收⽅的地址 
sendAddr=('192.168.1.103',8080)
#3.從鍵盤獲取數據 
sendData=raw_input("請輸⼊要發送的數據:")
#4.發送數據到指定的電腦上 
udpSocket.sendto(sendData,sendAddr)
#5.等待接收對⽅發送的數據 
recvData=udpSocket.recvfrom(1024)    #1024表示本次接收的最⼤字節數
#6.顯示對⽅發送的數據 
print(recvData)
#7.關閉套接字 
udpSocket.close()

  3.udp綁定信息

#coding=utf-8
from socket import *
#1. 建立套接字
udpSocket = socket(AF_INET, SOCK_DGRAM)
#2. 綁定本地的相關信息,若是⼀個⽹絡程序不綁定,則系統會隨機分配
bindAddr = ('', 7788) # ip地址和端⼝號,ip⼀般不⽤寫,表示本機的任何⼀個ip
udpSocket.bind(bindAddr)
#3. 等待接收對⽅發送的數據
recvData = udpSocket.recvfrom(1024) # 1024表示本次接收的最⼤字節數
#4. 顯示接收到的數據
print recvData
#5. 關閉套接字
udpSocket.close()

  4.echo服務器

#coding=utf-8
from socket import *
#1. 建立套接字
udpSocket = socket(AF_INET, SOCK_DGRAM)
#2. 綁定本地的相關信息
bindAddr = ('', 7788) # ip地址和端⼝號,ip⼀般不⽤寫,表示本機的任何⼀個ip
udpSocket.bind(bindAddr)
num = 1
while True:
    #3. 等待接收對⽅發送的數據
    recvData = udpSocket.recvfrom(1024) # 1024表示本次接收的最⼤字節數
    #4. 將接收到的數據再發送給對⽅
    udpSocket.sendto(recvData[0], recvData[1])
    #5. 統計信息
    print('已經將接收到的第%d個數據返回給對⽅,內容爲:%s'%(num,recvData[
    num+=1
#5. 關閉套接字
udpSocket.close()

  5.全雙工飛秋聊天程序

import socket,threading
# 發送數據
def send():
    while True:
        sendData = input("---")
        sendData = sendData.encode("gb2312")
        udpSocket.sendto(sendData,(sendAddr,iport))
# 接收數據
def recv1():
    while True:
        recvData = udpSocket.recvfrom(1024)
        print(recvData[0].decode("gb2312"))
# 定義全局變量 udpSocket
= None sendAddr = "" iport = 0 def main1(): global sendAddr global iport global udpSocket global lock1 udpSocket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) udpSocket.bind(("", 7878)) sendAddr = input("請輸入IP:") iport = int(input("請輸入端口號:"))
   #建立多線程 t1
= threading.Thread(target=send) t2 = threading.Thread(target=recv1) t1.start() t2.start() if __name__ == "__main__": main1()

6、TFTP

  TFTP客戶端--向服務器請求下載

import struct,socket
# 建立套接字 udpSocket
= socket.socket(socket.AF_INET,socket.SOCK_DGRAM) IP = "192.168.2.45" filename = "test.jpg"
# 構建下載請求數據 cmd_buf = struct.pack("!H8sb5sb",1,filename.encode(),0,"octet".encode(),0) sendAddr = (IP,69)
# 發送數據 udpSocket.sendto(cmd_buf,sendAddr)
# 打開下載文件 f
= open(filename,"ab")
while Turn:
  # 接收數據 recvData
= udpSocket.recvfrom(1024)
  # 獲取數據塊編號 opcode,ack_num
= struct.unpack("!HH",recvData[0][:4])
  # 獲取服務器的隨機端口 rand_port
= recvData[1][1]
  # 判斷操做碼是否錯誤
if int(opcode) == 5: print("文件不存在...") break print("操做碼:%d,ACK:%d,服務器隨機端口號:%d,數據長度:%d"%(Opcode, ack_num, rand_port, len(recvData[0])))
  # 寫入數據 f.write(reccvData[0][
4:]) if len(recvData[0]) < 516 break ack_data = struct.pack("!HH",4,ack_num)  # 回覆ACK確認包 udpSocket.sendto(ack_data,(IP,rand_port))
相關文章
相關標籤/搜索