# 理解 Transport Layer - TCP/UDP

## 簡介

本文將會介紹以下內容：

1. Transport Layer 的主要工作職責
2. [三方交握](https://www.techopedia.com/definition/10339/three-way-handshake)
3. TCP/UDP 傳輸的封包格式


## Transport Layer 的主要工作職責

![](https://i.imgur.com/jjE3gzk.png)

Network Layer 主要負責把資料從某個端點傳輸到另一端點

對於資料內容是否重送這部份的問題就是交給 Transport Layer 負責來處理

當封包到了 Transport Layer，Transport Layer 會把資料加入 PORT 的概念

來讓 Application Layer 可以來識別不同應用所需處理的資料

Transport Layer 主要有兩類 Protocol: 

### 1. TCP

TCP 這個協定主要可以讓接收方保證一定收到傳輸方收到的資料

nodejs 語言可以透過 [net](https://nodejs.org/api/net.html) 這個 module 來實作

### 2. UDP

UDP 這個協定主要處理傳輸串流資料，本身不保證資料的正確性或是否遺失

nodejs 語言可以透過 [dgram](https://nodejs.org/api/dgram.html) 這個 module 來實作

## [三方交握](https://www.techopedia.com/definition/10339/three-way-handshake)

TCP 主要會透過三方交握的方式要保證接收方都有傳送方的資料

其概念圖如下：

![](https://i.imgur.com/fsCFROX.png)

在建立要連線時，會先傳遞要傳送資料的傳送規格與一個驗證的 Sequence Number X 給接收方

而傳送方會把 X + 資料傳輸量大小 當作驗證的 Acknowledgement Number 並且產生一個隨機的 Sequence Number Y 傳回

最後傳送方在收到 Y 之後再把 Y+ 資料傳輸量大小 當作驗證的 Acknowledgement Number 傳回

如此一來就可以TCP 連線就可以建立了

## TCP/UDP 傳輸的封包格式


這邊只針對幾個有比較性的欄位做介紹

### TCP 傳輸格式概觀

![](https://i.imgur.com/2B8Bvy3.png)

首先是在 Transport Layer 時，封包回把 Source Port 與 Destination Port 解析出來

並且把傳輸的 Data 放到 Header 之後

Data 大小會變動不是一個固定的值

### UDP 傳輸格式概觀

![](https://i.imgur.com/GGhOW9A.png)

不同於 TCP傳輸格式

UDP 並沒有 Sequenece Number 與 Acknowledgement Number 來對接收資料做確保

UDP 的資料 Size 則固定為 8 bytes = 8 * 8 bits = 64 bit

## 參考

[1] [three-way-handshake](https://www.techopedia.com/definition/10339/three-way-handshake)

[2] [net module](https://nodejs.org/api/net.html)

[3] [dgram module](https://nodejs.org/api/dgram.html)
