---
# System prepended metadata

title: 網路

---

# 網路

# HTTP 超文本傳輸協議

## HTTP版本
* 0.9: request只能GET，傳輸內容為ASCII編碼為主
* 1.0: request增加多種方法(GET、POST、HEAD等)請求後斷線
* 1.1: 
    * reques請求後不斷線 
    * 有 pipeline 概念，但有Head-of-Line Blocking問題
    * 有 chunk 概念
    * 有 cache 的機制 
* HTTP/2
    * 向下相容1.1
    * 改善Head-of-Line Blocking問題(利用Multiplexing)
    * 最小化Protocol Overhead問題
    * 說短網頁載入時間以及傳輸延遲
    * 減少網站Connection數量
    * Binary Protocol 以二進制方式傳輸
    * Multiplexing 多工傳輸，不按順序傳輸回傳多個frame，藉由streamID來回傳對應請求
    * Header Compress 使用HPACK壓縮演算法對header壓縮
    * Server Push 自動推送client可能需要的資源
* HTTPS: 增加SSL安全超文字傳輸協定
## HTTP 基本常識
* 無狀態特性: 不同人不同電腦，只要知道相同HTTP Header 以及HTTP Methon都能得到相同內容
* 分散式架構: 
* 協作的架構
* 超文本(not just text but with link)


## HTTP request methon
* GET 取得該伺服器資料的內容
* HEAD 取得該伺服器資料的相關訊息
* POST 向指定資源提交資料，請求伺服器進行處理
* PUT 向指定資源位置上傳其最新內容
* DELETE 請求伺服器刪除Request-URI所標識的資源
* TRACE 回顯伺服器收到的請求，主要用於測試或診斷。
* OPTIONS 這個方法可使伺服器傳回該資源所支援的所有HTTP請求方法。可以測試伺服器功能是否正常運作
* CONNECT 
* PATCH 用於將局部修改應用到資源。
### HTTP cmd
```bash =
:~$ telnet 地址 port #建立TCP/IP連線
:~$ GET / (子地址 )HTTP/版本(1.0)
:~$ Host: 地址 #新增 HTTP header 前往網站
:~$ Range: byte=0-200(取得0-200byte的資料，為chunk的概念)
:~$ If-Modified-Since: (日期)
:~$ Accept-Language: en(語言) 
:~$ Accept-encoding : "gzip, deflate, br"
:~$ Connection : keep-alive
```


## HTTP request header
* Host: 取得網址中的特定 domain
* Range: 取得資料中特定範圍的byte
* If-Modified-Since: client詢問如果這個文件在這日期後沒有修改的話，則繼續使用此文件，此時server回傳304(有開cache的前提下)，以表示沒有修改
* Accept-Language: 只選擇給定語言的內容

 

## HTTP response status code
* 200: OK (伺服器成功回覆)
* 201: created (成功建立資料)
* 202: Accepted (交受要求，資料處理中，稍後再做請求)
* 3XX: 轉向
* 304: Not Modified
* 4XX: Client 錯誤
* 400: Bad Request
* 403: Forbidden(禁止用戶請求)
* 404: Not Found
* 406: Not Accepted
* 5XX: Server Error
* 500: Interal Server Error
* 502: Bad Gateway
* 503: Server Unavailable


# TCP/IP

## TCP/IP 分層

* physical later : ex.cabel, 電訊號
* data link layer : ex.MAC, 乙太網路, switch, 資料轉訊號
* network layer: ex.IP, routing
* transport layer: ex.TCP, UDP
* application layer: ex.HTTP

## TCP協議

* 基於連接
* 三次握手:
    ![](https://i.imgur.com/PSfuKxU.png)
* 數據傳輸
    ![](https://i.imgur.com/IaiPNSx.png)
* 四次揮手:
    ![](https://i.imgur.com/ZSHBJYD.png)
* 適合傳輸文件發送文件遊覽網頁

## UDP協議
* 基於非連接
* 單存傳輸數據包
* 校能消耗少、速度快、realtime
* 適合用於直播、通話、VPN

參考資料:[https://www.youtube.com/watch?v=Iuvjwrm_O5g&ab_channel=%E6%8E%8C%E8%8A%9D%E5%A3%AB](https://)

## IPV4
* 32位元，提供公2^32個固定IP
* 192.168.0.0-192.168.255.255為虛擬IP

## IPV6
* 由八個4位元16進制組成 3.4*10^38

## MAC
* 為網卡地址

## 網路遮罩MASK
* 將MASK (255.255.255.0) & IP地址 (192.168.1.1) = 192.168.1.0 用以判斷是否為同一子網
* TCP/IP協議中不同子網不能互相連線，當是不同子網時會將數居包的MAC地址改為GATEWAY的MAC地址

參考資料:[https://www.youtube.com/watch?v=tVNx-6OEy-k&ab_channel=%E7%A1%AC%E4%BB%B6%E8%8C%B6%E8%B0%88](https://)


API Python code
```python=
from flask import Flask, request, jsonify
from flask_cors import CORS
# import requests

app = Flask(__name__)
app.config["DEBUG"] = True
cors = CORS(app, resources={r"/*" : {"origins" : "*"}})

@app.route("/", methods=["GET"])
def print_something():
    return "something"

@app.errorhandler(400)
def bad_request(error):
    response = jsonify({'error': 'Bad Request'})
    response.status_code = 400
    return response

@app.route("/post", methods=["POST"])
def repeat():
    data = request.get_json()
    try:
        sentence = data["sentence"]
        return sentence
    except Exception as e:
        print(e)
        raise e


# def call_api(sentence):
#     import json
#     import requests
#     request_json = json.dumps({"sentence" : [sentence]})
#     headers = {"Content-type" : "application/json"}
#     r = requests.post('localhost:8001', data=request_json, headers=headers)
#     processed_data = r.text

#     return processed_data
if __name__ == "__main__":
    from waitress import serve 
    from paste.translogger import TransLogger
    

    serve(TransLogger(app, setup_console_handler=False),host="localhost", port=8001)
    # serve(app, host="localhost", port=8001)
    
    # app.run(host = "localhost",port = 8001, debug = True)
    

```

request Python code
```python=
def call_api(sentence):
    import json
    import requests
    request_json = json.dumps({"sentence" : [sentence]})
    headers = {"Content-type" : "application/json"}
    r = requests.post('http://127.0.0.1:8001/post', data=request_json, headers=headers)
    return json.loads(r.text)[0]

if __name__ == "__main__":
    print(call_api("hello_world"))
```