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))