# 上課共筆 * 物聯網線上影片: https://academy.digitalent.org.tw/course/incipas0001/ * Linkit 7697 Arduino IDE 下載與安裝網址 https://drive.google.com/drive/folders/1H7n2C5B2xTZgSa_4WFhVoIv6XWflv-tW * LinkIt 7697 - Arduino IDE 開發指南網址 https://docs.labs.mediatek.com/resource/linkit7697-arduino/zh_tw * # TCP/IP & Socket ## TCP/IP複習 * TCP的作用? TCP 提供網路的服務接點讓應用程式使用,也就是說,提供端點對端點(End-to-End)的連線。TCP 就提供多點服務的連線,讓各種應用程式可同時連結到網路上。 TCP主要目的為確保資料通訊的正確傳輸,提供流量控制的特性。 TCP用三路握手(或稱三方交握,three-way handshake)過程建立一個連接。在連接建立過程中,很多參數要被初始化,例如序號被初始化以保證按序傳輸和連接的強壯性。 ☆當應用層向TCP層發送用於網間傳輸的、用8位字節表示的數據流,TCP則把數據流分割成適當長度的報文段,最大傳輸段大小(MSS)通常受該計算機連接的網絡的數據鏈路層的最大傳送單元(MTU)限制。之後TCP把數據包傳給IP層,由它來通過網絡將包傳送給接收端實體的TCP層。☆ TCP一定要有三向交握、封包確認機制、逾時與重送機制、滑動窗。 UDP則沒有TCP的確認機制 TCP協定的執行可劃分為三個階段:連接建立(connection establishment)、資料傳送(data transfer)和連接終止(connection termination)。 TCP的全名為Transmission Control Protocol,屬於『傳輸層』的一種協定,也是屬於『端點對端點』(End-to-End)的 傳輸協定,亦稱為『主機對主機』(Host-to-Host)或『程序 對程序』(Process-to-Process)的傳輸協定換言之,在TCP的兩端主機,可透過彼此的溝通,確保資料在傳輸中的正確性,以及傳輸速率的控制,這些動作只是兩端的主機之間溝通即可,完全無關於中間所經過的任何結點(例如router或switch) TCP (Transmission Control Protocol) 是位於 OSI 參考模型中第四層傳輸層的一種網路通訊協定,為傳輸控制協定,主要目的是可確保資料通訊的正確傳輸,提供流量控制(flow control) 的特性。 主要功能:循序編號,資料確認與重送,錯誤檢查 ,流量控制 TCP為『可靠』的傳輸方式,有資料確認與重送、流量控制、連線導向的特性 TCP將資料視為 Bytes Stream、雙向傳輸的協定 TCP 是連接導向的傳輸方式。TCP 採用『三向握手式連絡法』(Three-way handshake)來實現連線處理方式,其中會用到封包內二個序號:Sequence Number(seq)及 Acknowledge Number(ack),以及 Code 欄位中四個旗標:ACK、SYN、FIN 和 RST。 * TCP與UDP的差異? UDP傳輸比TCP快、TCP可靠度較佳、TCP封包大小較大 ★TCP是雙向傳輸 UDP是單向.TCP傳送東西.會有封包數據.他可靠性高UDP可靠性低.傳送東西速度快★ TCP與UDP協定的運作行為不同,UDP是未經過與對方的連線,便直接將資料傳送出去,傳送過程也不經過與對方確認是否收到;反之,TCP是一個完整的協定,也就是會經過『建立連線』、『資料傳輸』與最後的『關閉連線』三個階段。 TCP較UDP可靠 TCP再傳送前會進行連線請求,UDP則不會。 TCP提供的是一個連線導向(Connection Oriented)的可靠傳輸﹐前面所介紹的傳送層檢測手續﹐都會在 TCP 中得到實現。 UDP則是一個非連線型(Connectionless)的非可靠傳輸協定﹐它並不會運用確認機制來保證資料是否正確的被接收、不需要重傳遺失的資料、資料的接收可不必按順序進行、也不提供回傳機制來控制資料流的速度。 UDP協議與TCP工作原理類似,但是TCP會把所有的錯誤檢測資訊也一併發出。所有的往返通信和傳輸保險會拖慢整體速度。 TCP這個協定最主要的特色在於傳輸資料時,需要驗證資 料,確保正確性。所以花的時間稍多一點。 而UDP這個協定最主要的特色在於傳輸資料時,不需要驗 證資料,不保證正確性,所以比較省時間。而一般來說, 像是多媒體串流(streaming)就是使用這種協定。 UDP比TCP速度快,但非常不穩,也不可靠。 UDP為非連接式(Connectionless)的傳送,不具備確認送達目的地,而TCP有提供,所以TCP較為可靠。 使用UDP的考量:為了要降低對電腦資源的需求、應用程式本身已提供資料完整性的檢查機制 TCP提供傳輸資料的正確傳輸,若是未傳輸成功或傳輸資訊不正確,會要求重送 UDP則是提供非連線及非可靠的資料傳輸服務 ![](https://i.imgur.com/PkxSGZe.png) * 應用程式要先知到哪些資訊才能與另一個程式透過Internet交換資訊? * ip位址 port number ## Socket API ![](https://i.imgur.com/EwoAyd2.png) TCP Socket: ![](https://i.imgur.com/HNjhHUu.png) UDP Socket: ![](https://i.imgur.com/E2JTWI9.png) Python Socket 教學: [ ](https://) TCP Client connecting to google: ```python=0 import socket import sys s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) host = 'www.google.com' port = 80 remote_ip = socket.gethostbyname( host ) print (remote_ip) s.connect((remote_ip , port)) message = "GET / HTTP/1.1\r\n\r\n" s.sendall(message.encode()) reply = s.recv(4096) print (reply) s.close() ``` ```python=0 import socket import sys try: s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) except: print ('Failed to create socket. Error code: ',str(msg[0]),' , Error message : ',msg[1]) sys.exit() print('Socket Created') host = 'www.google.com' port=80 try: remote_ip=socket.gethostbyname(host) except: print('Hostname could not be resolved. Exiting') sys.exit() print('IP Address of ',host,' is ',remote_ip) s.connect((remote_ip,port)) print('Socket Connected to ',host,' on ip ',remote_ip) message="GET / HTTP/1.1\r\n\r\n" try: s.sendall(message.encode()) except: socket.error() print('Send failed') sys.exit() print('Message send successfully') reply=s.recv(4096) print(reply) s.close() ```