---
# System prepended metadata

title: 上課共筆

---

# 上課共筆
* 物聯網線上影片：
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()

```

