初學TCP和UDP一些總結

2021-09-27 00:22:29 字數 3620 閱讀 2071

#socket又稱"套接字",應用程式通常通過"套接字"向網路發出請求或者應答網路請求

#socket非常類似於**插座。以乙個國家級**網為例,**的通話雙方相當於相互通訊的2個程序,區號是#它的網路位址;區內乙個單位的交換機相當於一台主機,主機分配給每個使用者的局內號碼相當於socket號。任#何使用者在通話之前,首先要占有一部**機,相當於申請乙個socket;同時要知道對方的號碼,相當於對方有#乙個固定的socket。然後向對方撥號呼叫,相當於發出連線請求(假如對方不在同一區內,還要撥對方區號,#相當於給出網路位址)。假如對方在場並空閒(相當於通訊的另一主機開機且可以接受連線請求),拿起**話筒#,雙方就可以正式通話,相當於連線成功。雙方通話的過程,是一方向**機發出訊號和對方從**機接收信#號的過程,相當於向socket傳送資料和從socket接收資料。通話結束後,一方掛起**機相當於關閉socket#,撤消連線。

在internet上的主機一般執行了多個服務軟體,同時提供幾種服務。每種服務都開啟乙個socket,並繫結到乙個埠上,不同的埠對應於不同的服務。socket正如其英文原義那樣,像乙個多孔插座。一台主機猶如布滿各種插座的房間,每個插座有乙個編號,有的插座提供220伏交流電, 有的提供110伏交流電,有的則提供有線電視節目。 客戶軟體將插頭插到不同編號的插座,就可以得到不同的服務。

///int socket(int domain, int type, int protocol);

引數說明:

domain:協議域,又稱協議族(family)。常用的協議族有af_inet、af_inet6、af_local(或稱af_unix,unix域socket)、af_route等。協議族決定了socket的位址型別,在通訊中必須採用對應的位址,如af_inet決定了要用ipv4位址(32位的)與埠號(16位的)的組合、af_unix決定了要用乙個絕對路徑名作為位址。

type:指定socket型別。常用的socket型別有sock_stream、sock_dgram、sock_raw、sock_packet、sock_seqpacket等。流式socket(sock_stream)是一種面向連線的socket,針對於面向連線的tcp服務應用。資料報式socket(sock_dgram)是一種無連線的socket,對應於無連線的udp服務應用。

protocol:指定協議。常用協議有ipproto_tcp、ipproto_udp、ipproto_stcp、ipproto_tipc等,分別對應tcp傳輸協議、udp傳輸協議、stcp傳輸協議、tipc傳輸協議。

注意:1.type和protocol不可以隨意組合,如sock_stream不可以跟ipproto_udp組合。當第三個引數為0時,會自動選擇第二個引數型別對應的預設協議。

2.windowssocket下protocol引數中不存在ipproto_stcp

/建議你使用python2開啟

#建立乙個socket物件

client=socket.socket(socket.af_inet,socket.sock_stream)

#連線客戶端

client.connect((target_host,target_port))

#傳送一些資料

#接收一些資料

responce=client.recv(4096)

print(responce)

/將上述**的host改為www.baidu.com就可以通過那個connect那一行了

//str通過encode()方法可以編碼為指定的bytes

//反過來,如果我們從網路或磁碟上讀取了位元組流,那麼讀到的資料就是bytes。要把bytes變為str,就需要用//decode()方法:

//發現這裡python3.5和python2.7在套接字返回值解碼上有區別。

//你如果傳送其他的資料就會有不同的輸出

import socket

target_host="127.0.0.1"

target_port=80

client=socket.socket(socket.af_inet,socket.sock_dgram)

str="aaabbbccc"

client.sendto(str.encode(),(target_host,target_port))

data, addr=client.recvfrom(4096)

print(responce)

///import socket

host = '127.0.0.1'

#兩個段口必須一致

port = 25535

addr = (host, port)

byte = 1024

sock = socket.socket(socket.af_inet, socket.sock_dgram)

while true:

data = input("please input the message:")

text = data.encode('utf-8')

sock.sendto(text, addr)

#輸入'exit'退出

if data == 'exit':

break

else:

#getsockname返回當前套接字的資訊(ip,埠號)

print("the os assigned me the address {}".format(sock.getsockname()))

data, addr = sock.recvfrom(byte)

text = data.decode("utf-8")

print('the server {} replied'.format(addr, text))

sock.close()

//from socket import *

host='localhost'

port=9999

s = socket(af_inet,sock_dgram)

s.connect((host,port))

while true:

message = input('send message: ')

s.sendall(message.encode('utf-8'))

data = s.recv(1024)

print(data)

s.close()

TCP和UDP的一些注意事項

tcp的一些注意事項 1.tcp伺服器一般情況下都需要繫結,否則客戶端找不到這個伺服器,更無法鏈結到伺服器 2.tcp客戶端一般不繫結,因為是主動鏈結伺服器,所以只要確定好伺服器的ip port等資訊就好,本地客戶端可以隨機。而且可以避免開啟伺服器時發生埠問題 3.tcp伺服器中通過listen可以...

tcp和udp使用總結

tcp tcp 是面向連線的,並且是一種可靠的協議,在基於 tcp 進行通訊時,通訊雙方需要先建立乙個 tcp 連線,建立連線需要經過三次握手,握手成功才可以進行通訊 1 基於連線的,可靠性高 2 有連線過程 3次握手過程 會有延時,實時性較差,3 傳輸相同的資料時,tcp首部開銷20位元組 udp...

TCP和UDP的總結

近期正在準備找工作,看了n多筆試題,發現考網路真的還不少,網路中尤其tcp,udp等知識點考的較多,此文做個總結,方便以後查閱,閱讀者歡迎找毛病 tcp實現可靠性傳輸,通過三次握手機制,這一機制保證校驗了資料,保證了他的可靠性。udp沒有三次握手機制,所以不可靠。不過udp的速度是tcp比不了的,而...