# 上課共筆
* 物聯網線上影片:
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則是提供非連線及非可靠的資料傳輸服務

* 應用程式要先知到哪些資訊才能與另一個程式透過Internet交換資訊?
*
ip位址 port number
## Socket API

TCP Socket:

UDP Socket:

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