1. 程式人生 > 其它 >計算機網路:套接字(Socket)

計算機網路:套接字(Socket)

所謂套接字(Socket),就是對網路中不同主機上的應用程序之間進行雙向通訊的端點的抽象。一個套接字就是網路上程序通訊的一端,提供了應用層程序利用網路協議交換資料的機制。從所處的地位來講,套接字上聯應用程序,下聯網路協議棧,是應用程式通過網路協議進行通訊的介面,是應用程式與網路協議根進行互動的介面。

1.套接字的功能

傳輸層真正連線的是套接字,通過套接字將資料傳送給特定的程序。套接字位於傳輸層及應用層之間,是一個應用程式設計介面,應用程式通過呼叫此介面進行傳輸接收資料。

傳輸層如何標識套接字:通過ip地址+埠號標識套接字,套接字綁定了主機埠號,ip地址對應相應的主機,程序監控相應埠

注意:一臺主機上一個埠號只能對應一個程序,一個程序可以監控多個埠

所以網上給的定義:套接字=ip地址+埠號,ip地址及埠號會封裝到傳輸層的資料(報文)中

2.呼叫套接字API的過程

基於TCP傳輸層協議

譬如Python的socket庫,服務端

 1 # -*- coding: utf-8 -*-
 2 import socket
 3 import sys
 4 def socket_service_data():
 5     name = socket.gethostname()
 6     HOST = socket.gethostbyname(name)  # 獲取阿里雲伺服器私網IP,使用ifconfig可查詢
 7     PORT = 60000 #
安全組中設定 8 try: 9 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 10 s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 11 # s.bind(('127.0.0.1', 6666)) # 在同一臺主機的ip下使用測試ip進行通訊 12 s.bind((HOST, PORT)) #在不同主機或者同一主機的不同系統下使用實際ip 13 s.listen(10) 14 except
socket.error as msg: 15 print(msg) 16 sys.exit(1) 17 18 print("Wait for Connection..................") 19 20 while True: 21 sock, addr = s.accept() 22 buf = sock.recv(1024) #接收資料 23 buf = buf.decode() #解碼 24 print("The data from " + str(addr[0]) + " is " + str(buf)) 25 print("Successfully") 26 # return buf 27 sock.close() 28 if __name__ == '__main__': 29 socket_service_data()

客戶端

 1 import socket
 2 import sys
 3 def sock_client_data():
 4     while True:
 5         try:
 6             s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 7             s.connect(('192.168.112.8', 60000))  #伺服器和客戶端在不同的系統或不同的主機下時使用的ip和埠,首先要檢視伺服器所在的系統網絡卡的ip
 8             # s.connect(('127.0.0.1', 6666))  #伺服器和客戶端都在一個系統下時使用的ip和埠
 9         except socket.error as msg:
10             print(msg)
11             print(sys.exit(1))
12         data = input("input data:")   #輸入要傳輸的資料
13         s.send(data.encode())  #將要傳輸的資料編碼傳送,如果是字元資料就必須要編碼傳送
14         s.close()
15 if __name__ == '__main__':
16     sock_client_data()

基於UDP傳輸層協議

常用的Socket API函式

  1. scoket():建立並返回套接字
  2. bind():套接字繫結本地埠

3.套接字的分類

主要是根據傳輸層兩個協議劃分的:

1.流式套接字。基於TCP,TCP協議是將資料看作無記錄無邊界的位元組流,實現資料無差錯、無重複的傳輸。所以稱接受此類資料的套接字為流式套接字,內設流量控制。

2.資料報套接字。基於UDP,資料包以獨立的形式傳送傳輸過程資料可能被丟失。所以稱接收此類資料的套接字為資料報套接字。

3.原始套接字。該套接字允許對較低層協議(如IP或ICMP)進行直接訪問。基本上很少用。

參考:https://blog.csdn.net/shang_0122/article/details/104273944

Python庫官方文件