Brendon
    • Create new note
    • Create a note from template
      • Sharing URL Link copied
      • /edit
      • View mode
        • Edit mode
        • View mode
        • Book mode
        • Slide mode
        Edit mode View mode Book mode Slide mode
      • Customize slides
      • Note Permission
      • Read
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Write
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Engagement control Commenting, Suggest edit, Emoji Reply
    • Invite by email
      Invitee

      This note has no invitees

    • Publish Note

      Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

      Your note will be visible on your profile and discoverable by anyone.
      Your note is now live.
      This note is visible on your profile and discoverable online.
      Everyone on the web can find and read all notes of this public team.
      See published notes
      Unpublish note
      Please check the box to agree to the Community Guidelines.
      View profile
    • Commenting
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
      • Everyone
    • Suggest edit
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
    • Emoji Reply
    • Enable
    • Versions and GitHub Sync
    • Note settings
    • Note Insights New
    • Engagement control
    • Make a copy
    • Transfer ownership
    • Delete this note
    • Save as template
    • Insert from template
    • Import from
      • Dropbox
      • Google Drive
      • Gist
      • Clipboard
    • Export to
      • Dropbox
      • Google Drive
      • Gist
    • Download
      • Markdown
      • HTML
      • Raw HTML
Menu Note settings Note Insights Versions and GitHub Sync Sharing URL Create Help
Create Create new note Create a note from template
Menu
Options
Engagement control Make a copy Transfer ownership Delete this note
Import from
Dropbox Google Drive Gist Clipboard
Export to
Dropbox Google Drive Gist
Download
Markdown HTML Raw HTML
Back
Sharing URL Link copied
/edit
View mode
  • Edit mode
  • View mode
  • Book mode
  • Slide mode
Edit mode View mode Book mode Slide mode
Customize slides
Note Permission
Read
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Write
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Engagement control Commenting, Suggest edit, Emoji Reply
  • Invite by email
    Invitee

    This note has no invitees

  • Publish Note

    Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

    Your note will be visible on your profile and discoverable by anyone.
    Your note is now live.
    This note is visible on your profile and discoverable online.
    Everyone on the web can find and read all notes of this public team.
    See published notes
    Unpublish note
    Please check the box to agree to the Community Guidelines.
    View profile
    Engagement control
    Commenting
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    • Everyone
    Suggest edit
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    Emoji Reply
    Enable
    Import from Dropbox Google Drive Gist Clipboard
       Owned this note    Owned this note      
    Published Linked with GitHub
    • Any changes
      Be notified of any changes
    • Mention me
      Be notified of mention me
    • Unsubscribe
    # 無線網路筆記 ## Chapter 3 ### Principles of reliable data transfer ![](https://i.imgur.com/V4wmzMu.png) * 目標:想要在Transport layer達成reliable的傳輸 ![](https://i.imgur.com/ANrxYx3.png) * 主要針對rdt_send()和rdt_rcv()設計,用以達到reliable的傳輸 ### rdt1.0 * 假設無error bit跟packet loss ![](https://i.imgur.com/RYIzU7v.png) ### rdt2.0 * 假設會有error bit,所以增加了check sum來進行檢查是否傳對 * 新增ACK&NAK,接收端回傳ACK代表傳對,回傳NAK代表有錯誤 * 傳送端在傳送之後會在Wait for ACK or NAK的狀態,若接收到NAK則會重傳,直到接收到ACK才會回到Wait for call的狀態 ![](https://i.imgur.com/HwZ9lzl.png) ### rdt2.1 * 為了解決rdt2.0無法確認ACK/NAK有沒有傳錯,所以當傳送端無法辨識接收端的ACK/NAK時會重傳資料,但這樣有可能導致接收端取得重複的資料 * 為了避免接收端取得重複的資料,在封包新增了"Sequence Number"來檢查是否重複,因為採用stop and wait所以Sequence Number只需要0和1就夠了,若有重複接收端則會丟棄封包 #### sender ![](https://i.imgur.com/y9RHpw1.png) #### receiver ![](https://i.imgur.com/zfBG4kS.png) ### rdt2.2 A NAK-free protocal * 基本上跟rdt2.1一樣但不再用NAK了,只用ACK * ACK新增number ![](https://i.imgur.com/M5cvV3J.png) ### rdt3.0 * 假設有error bit跟packet loss的情況 * 假如packet loss的話,因為傳送端採用stop and wait沒有接收到ACK,所以會卡住 * 因此傳送端新增"Count Donw Timer",在時間內要接收到回覆,若Time out就會重傳,用以解決上述問題 * 若check sum檢查錯誤不會重傳,等待time out時間到再重傳,避免多次重傳 ![](https://i.imgur.com/dn54g9X.png) #### no loss ![](https://i.imgur.com/So3qEkz.png) #### packet loss ![](https://i.imgur.com/CkokIh6.png) #### ACK loss ![](https://i.imgur.com/xPJcL70.png) * 不收封包但還是要回覆ACK給傳送端 #### Premature timeout ![](https://i.imgur.com/v3ocZq5.png) * 不收封包但還是要回覆ACK給傳送端 ### Performance of rdt3.0 ![](https://i.imgur.com/FbVpS9x.png) * 傳資料的時間佔總傳輸的比例 ![](https://i.imgur.com/LvRIr9R.png) ### Pipeline protocal * 為了改善stop and wait的效率問題 * 一次送出好幾個封包 * Sequence number遞增 * 傳送端跟接收端都有buffer #### stop and wait V.S. Pipeline ![](https://i.imgur.com/bQ4BQs1.png) #### Performance of using pipeline ![](https://i.imgur.com/ibfUDwX.png) ### Pipeline protocal "Go-Back-N" sliding window protocal * k-bits的sqeunce number在封包裡 * 但window最大只能用到2^k-1 bits * Cumulative ACK:ACK(n)代表n之前的資料都確定有傳輸成功,所以沒收到ACK(n-1)也沒差 * 若在window最前面的資料time out,則會重傳所有資料,這也是此協定叫Go-Back-N的原因 ![](https://i.imgur.com/9YtRMMs.png) ### FSM of Go-Back-N #### sender ![](https://i.imgur.com/EgrdXLd.png) #### receiver ![](https://i.imgur.com/Jhutw0e.png) * 按照順序進來的才會收 #### example ![](https://i.imgur.com/RHXaOWa.png) ### Pipeline protocal "Selective Repeat" * 收到的封包個別回傳ACK,並且暫存在Buffer裡,等封包都補齊才會傳到應用層 * 傳送端只需要重傳錯誤的封包就好 * 每個封包都有自己的timer * 傳送端與接收端都有一個相同大小的window最大為2^(k-1) ![](https://i.imgur.com/mhEkq7U.png) #### sender and receiver ![](https://i.imgur.com/spIGGu6.png) #### example ![](https://i.imgur.com/FFlqOsJ.png) #### Selective repeat:dilemma * 可能重複接收相同的資料 * 將window size切成兩半就可以解決序號重疊的問題,這也是為甚麼window size最大只能為2^(k-1) ![](https://i.imgur.com/gMHKzjN.png) ### TCP segment structure ![](https://i.imgur.com/OlAHwEF.png) #### TCP sequence# and ACKs ![](https://i.imgur.com/Y88YGQ5.png) #### TCP RTT and Timeout * Timeout的時間太長或太短都不好,但在設定合適的Timeout之前我們必須先知道RTT,所以採用統計的結果,也就是"SampleRTT"來當作合適的RTT ![](https://i.imgur.com/Cg6Oj4X.png) * 但因為想要讓SampleRTT平滑一點,所以用以下公式來平滑SampleRTT會計算出"EstimatedRTT" ![](https://i.imgur.com/Jbdfvx4.png) ![](https://i.imgur.com/Xmvq8oQ.png) * 可是我們不能直接把EstimatedRTT當作Timeout的時間,要加上一個"safety margin"(4個標準差) * 通常將EstimatedRTT+4 * DevRTT(標準差)當作Timeout ![](https://i.imgur.com/aKOwt6U.png) #### TCP sender events ![](https://i.imgur.com/HYWy0ZN.png) ![](https://i.imgur.com/H6bh9dj.png) #### TCP retransmission scenarios ##### lost ACK ![](https://i.imgur.com/ZO790Zt.png) ##### premature timeout ![](https://i.imgur.com/2rSwi6E.png) ##### Cumulative ACK * Cumulative ACK的作用,所以前面的ACK lost也沒關係 ![](https://i.imgur.com/XsU39Fv.png) #### Fast retransmission * 如果接收端連續收到三個重複的ACK的話會直接重傳,不需要等到timeout ![](https://i.imgur.com/9Tu1NYi.png) #### TCP flow control * 計算buffer剩餘的空間也就是"RecWindow",傳送端最多只能傳送跟RecWindow一樣大的資料 ![](https://i.imgur.com/QZhIMhf.png) #### Connection Management * 連線建立 1. Client端傳送SYN為1的封包做為連線請求 2. Server端接收SYN並回覆一個SYNACK 3. Client端接收SYNACK並回覆ACK ![](https://i.imgur.com/mtTXJGv.png) * 連線中斷 1. Client端發送FIN標頭為1的封包 2. Server端接收到FIN回傳ACK,此時就完成關閉了,再傳送一個FIN告訴client端已經完成關閉了 3. Client啟動一個count down timer,並回傳ACK,timer結束後就會關閉連線 ![](https://i.imgur.com/cWsLTw9.png) ![](https://i.imgur.com/vytIXgI.png) * TCP life cicle ![](https://i.imgur.com/eE5Saaf.png) #### Causes/costs of congestion 1. 完美的情況,沒有loss 2. 當有loss的時候input就包含重傳所以output的資料一定小於input 3. premature的情況,資料重傳>> ![](https://i.imgur.com/J3cusWh.png). * 網路壅塞的例子 ![](https://i.imgur.com/HV2msdv.png) #### TCP Congestion control 1. AIMD(Additive Increase Multiplicative Decrease) * AI線性增加,每次加1 * MD如果發生loss event(接收三個重複的的ACK或Timeout)就減半或減至1 ![](https://i.imgur.com/aFmXPsU.png) 2. Slow start * 剛建立連線TCP的initial transmission rate太低了 * 因此讓傳輸速度已指數的速度上升,每次傳輸cwnd就double,直到第一次event loss之後cwnd有兩種情況 1. 若為3-duplicate-ACKs會減半,並改用線性增長 2. 若為Timeout會直接變回1MSS,再繼續用指數增長,直到到達threshold後改用線性增長 3. Threshold的值為發生loss event前一瞬間的cwnd的一半 ![](https://i.imgur.com/cDpYj4W.png) ![](https://i.imgur.com/Jk1Zdjx.png) * 小於Threshold -> slow start 指數增加 * 大於Threshold -> congestion-avoidance 線性增加 #### TCP throughput ![](https://i.imgur.com/COyHOxB.png) ![](https://i.imgur.com/k8R04Ek.png) #### TCP fairness * 發生event loss的時候,彼此傳輸的頻寬大小會越來越靠近 ![](https://i.imgur.com/TOxLaMY.png) ![](https://i.imgur.com/DgOuSba.png) ## Chapter 4 ### Network layer * 網路層的目的將傳輸層的Segement從傳送端傳到接收端 * 將傳輸層的Segement包裝成datagram(packet) * 確認沒問題去除網路層標頭再傳送到傳輸層 * 路由器:檢查packet的標頭,決定要傳輸到哪裡 #### Key Network-Layer Functions * Forwarding (Data plane): 將packet從input傳送到恰當的output (轉機) * Routing (Control plane): 決定封包從起點到目的走的路徑 (行程安排) * 傳統的Routing algorithms * Software-defined networking: 由遠端的控制中心來決定路由的路徑 ![](https://i.imgur.com/ID5Z2DE.png) #### Data plane * Local ![](https://i.imgur.com/lRvRjIx.png) #### Control plane * Network-wide logic ![](https://i.imgur.com/d1Lw3Rb.png) ### Router Architecture Overview * 執行路由演算法 * RIP * OSPF * BGP * Forwarding ![](https://i.imgur.com/O8HX2ud.png) ### Input port function * Line termination: 實體網路線 * Data lin processing: 解封裝處理標頭 * 網路層 Decentralized switching (分散式交換): * 根據封包的目的地,查看forwarding table尋找合適的輸出 * Destination-based forwarding: forward based only on destination IP address (traditional) * Generalized forwarding: decision is not based on the destination address. ![](https://i.imgur.com/IcpujHS.png) ### Switching fabrics * Memory ![](https://i.imgur.com/Q93ESHZ.png) * Cross bar ![](https://i.imgur.com/LfYojs1.png) * Bus ![](https://i.imgur.com/azVMsip.png) #### Switching Via Memory * 將封包複製到memory * 記憶體的頻寬會限制處理的速度 ![](https://i.imgur.com/04hYiLc.png) #### Switching Via Bus * 從輸入的memory到輸出的memory * 透過一個Bus來交換 * Bus contention: 交換的速度被Bus的頻寬限制 #### Switching via interconnection network * 為了解決Bus競爭頻寬的問題 * Banyan network: 切成很多小的block,競爭就變少了 ![](https://i.imgur.com/UczVrV9.png) * Advanced design: 把Datagram切成比較小的cell ### Output ports ![](https://i.imgur.com/9aRJzIX.png) * Buffer: 當輸出的速度小於輸入的速度就會產生queueing,可能導致packet lost. * Scheduling: 決定packet誰先誰後的規格 ### Queueing * Queueing delay * Packet loss #### Output queueing ![](https://i.imgur.com/NeKvPj1.png) #### Input queueing * 線路傳輸的速度比資料進來的速度還慢的時候會產生queueing * Head of the line blocking: 前面的datagram卡住後面的datagram移動 ![](https://i.imgur.com/P7JGBEX.png) ### Scheduling mechanisms * Scheduling: 選擇要傳送的packet * FIFO scheduling: send in order * 當Queue滿了有以下discard policy * tail drop: 丟掉來進來的packet * priority: 根據優先度來決定drop的packet * random: 隨機丟棄 ### Scheduling policies #### Priority scheduling * sent priority最高的packet * 有很多class,每個class的priority都不一樣 ![](https://i.imgur.com/SSqAvIW.png) #### Round Robin (RR) scheduling * 有很多class輪流sent ![](https://i.imgur.com/odfo4XW.png) ### Weighted Fair Queuing * 每個cycle都會計算權重,根據權重來決定sent哪個packet ![](https://i.imgur.com/ccfgmZy.png) ### IP datagram format * IP protocol version: 4bits, ipv4,ipv6 * Header length:表示封包有幾列,以下範圍為5 * Type of service * Length:表示整個datagram的長度 * For fragmentation and reassembly * 16-bit ID: 表示封包序號 * flag: 3bits * fragment-offset: 13bits * Time to live: 每經過一個hop就會減1 * Upper layer: 看採用上層的什麼協定UDP or TCP * Check sum * Source IP * Destination IP ![](https://i.imgur.com/7lNUeUI.png) ### IP fragmentation, reassembly * 因為link有Maximum Transmission Unit,所以要將一個比較大的封包切成幾個比較小的封包,最後再送達目的地之前重組 * 16-bit ID用來辨別是不是同個packet的fragmentation ![](https://i.imgur.com/B0pJEn9.png) * 每個封包都有20Byte的標頭 * offset必須為8的倍數 ![](https://i.imgur.com/tuDPg6K.png) ### IP addressing: introduction * IP address: 32bits的辨別碼,就像地址一樣 * Router有很多interface,每個interfaces有不同的ip address * 分成部分,8bits為一部分 ![](https://i.imgur.com/11boDZT.png) #### Subnet * subnet part of ip會一樣 * 不需要Router也可以互相溝通 ![](https://i.imgur.com/IGTJiG1.png) #### CIDR(Classless InterDomain Routing) * 23代表被用來當作subnet part的bit數 ![](https://i.imgur.com/39yjtD5.png) ### DHCP: Dynamic Host Configuration Protocol * IP由DHCP server來分配給host * DHCP步驟 1. DHCP discover: Host用廣播來搜尋DHCP server 2. DHCP offer: DHCP server提供可用的ip給Host 3. DHCP request: 向網路發送一個DHCP Request廣播封包,告訴所有DHCP伺服器它將指定接受那一台伺服器提供的IP位址。 4. DHCP ack: 當DHCP伺服器接收到客戶端的DHCP Request之後,會客戶端發出一個DHCK Ack回應,以確認IP租約的正式生效。 ![](https://i.imgur.com/SFMdXij.png) * 其他DHCP也可以分配的資訊 * Default Gate way * 子網路遮罩 * DNS server ### Hierarchical addressing * 子網路切割 * 可以分給更多機構使用 * 更靈活使用 ![](https://i.imgur.com/MjzodFX.png) * 下面的情況要傳給200.23.18.0/23的這段 (Longest prefix matching) ![](https://i.imgur.com/uacZrVs.png) * ICANN:網路ip分配的機構 * 分配address * 管理DNS * Assign domain ### NAT (Network Address Translation) * 內部的ip都會轉成一個對外的ip ![](https://i.imgur.com/ypcSYoH.png) * Motivation: * 節省ip的使用量 * 提升安全性 * Implementation 1. outgoing datagrams:將 source(IP, port#) to NAT(IP, port#) 2. remember:用一個translation table紀錄,外部傳進來的時候才知道要傳給內部哪個Host 3. incoming datagrams:NAT(IP, port#)查表找source(IP, port#) ![](https://i.imgur.com/XMa1Twg.png) ### IPv6 * 為了解決IPv4不夠用的問題 * 固定長度為40Byte = 4+4+16+16 * 不能切割packet #### IPv6 Header * Version: 4bits, IPv4 or IPv6 * Priority: 8bits,決定packet服務的優先權 * Flow label: 用來辨別相同的datagrams * Payload len: Data的長度 * Next header: TCP or UDP * Hop limit: Time to live,每經過一個路由會-1 * Source address: 128bits = 16Byte * Destination address: 128bits = 16Byte ![](https://i.imgur.com/r0VUMRX.png) * Change from IPv4 * Checksum: 被移除了,處理速度會變快 * Options: 被移除了,如果真的需要會記錄在Next Header * ICMPv6: 新版本的ICMP #### Transition from IPv4 to IPv6 * no “flag days” -> IPv4 不能就這樣直接不見,設備成本很高 * 利用Tunneling來進行IPv4跟IPv6的溝通 * 把IPv6包裝成IPv4的封包 ![](https://i.imgur.com/5vZjXyN.png) ![](https://i.imgur.com/f4oMdsr.png) ### Generalized Forwarding and SDN * flow table 由logically centralized routing controller 生成 #### OpenFlow data plane abstraction * flow 定義在標頭 * generalized forwarding: 簡易的封包處理規則 * Pattern: 用來match封包裡的資訊 * Action for matched packet * Drop * Forward * Modify * Send to controller * Priority: Pattern重疊時,利用優先度決定 * Counters: #bytes and #packets #### OpenFlow abstraction * Router * match: longest destination IP prefix * action: forward out a link * Switch * match: 目的地Mac位址 * action: forward or flood(?) * Firewall * match: IP address 跟 port * action: 允許或阻斷 * NAT * match: IP addess跟port * action: 內部的ip跟port轉換成對外的ip跟port #### Examples ![](https://i.imgur.com/53wO1cD.png) * Flow Table Entries ![](https://i.imgur.com/3fxRnha.png) * Destination-based forwarding ![](https://i.imgur.com/KyG2yia.png) * Firewall ![](https://i.imgur.com/sNi836y.png) * Switch forwarding ![](https://i.imgur.com/IlMd4EJ.png)

    Import from clipboard

    Paste your markdown or webpage here...

    Advanced permission required

    Your current role can only read. Ask the system administrator to acquire write and comment permission.

    This team is disabled

    Sorry, this team is disabled. You can't edit this note.

    This note is locked

    Sorry, only owner can edit this note.

    Reach the limit

    Sorry, you've reached the max length this note can be.
    Please reduce the content or divide it to more notes, thank you!

    Import from Gist

    Import from Snippet

    or

    Export to Snippet

    Are you sure?

    Do you really want to delete this note?
    All users will lose their connection.

    Create a note from template

    Create a note from template

    Oops...
    This template has been removed or transferred.
    Upgrade
    All
    • All
    • Team
    No template.

    Create a template

    Upgrade

    Delete template

    Do you really want to delete this template?
    Turn this template into a regular note and keep its content, versions, and comments.

    This page need refresh

    You have an incompatible client version.
    Refresh to update.
    New version available!
    See releases notes here
    Refresh to enjoy new features.
    Your user state has changed.
    Refresh to load new user state.

    Sign in

    Forgot password

    or

    By clicking below, you agree to our terms of service.

    Sign in via Facebook Sign in via Twitter Sign in via GitHub Sign in via Dropbox Sign in with Wallet
    Wallet ( )
    Connect another wallet

    New to HackMD? Sign up

    Help

    • English
    • 中文
    • Français
    • Deutsch
    • 日本語
    • Español
    • Català
    • Ελληνικά
    • Português
    • italiano
    • Türkçe
    • Русский
    • Nederlands
    • hrvatski jezik
    • język polski
    • Українська
    • हिन्दी
    • svenska
    • Esperanto
    • dansk

    Documents

    Help & Tutorial

    How to use Book mode

    Slide Example

    API Docs

    Edit in VSCode

    Install browser extension

    Contacts

    Feedback

    Discord

    Send us email

    Resources

    Releases

    Pricing

    Blog

    Policy

    Terms

    Privacy

    Cheatsheet

    Syntax Example Reference
    # Header Header 基本排版
    - Unordered List
    • Unordered List
    1. Ordered List
    1. Ordered List
    - [ ] Todo List
    • Todo List
    > Blockquote
    Blockquote
    **Bold font** Bold font
    *Italics font* Italics font
    ~~Strikethrough~~ Strikethrough
    19^th^ 19th
    H~2~O H2O
    ++Inserted text++ Inserted text
    ==Marked text== Marked text
    [link text](https:// "title") Link
    ![image alt](https:// "title") Image
    `Code` Code 在筆記中貼入程式碼
    ```javascript
    var i = 0;
    ```
    var i = 0;
    :smile: :smile: Emoji list
    {%youtube youtube_id %} Externals
    $L^aT_eX$ LaTeX
    :::info
    This is a alert area.
    :::

    This is a alert area.

    Versions and GitHub Sync
    Get Full History Access

    • Edit version name
    • Delete

    revision author avatar     named on  

    More Less

    Note content is identical to the latest version.
    Compare
      Choose a version
      No search result
      Version not found
    Sign in to link this note to GitHub
    Learn more
    This note is not linked with GitHub
     

    Feedback

    Submission failed, please try again

    Thanks for your support.

    On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?

    Please give us some advice and help us improve HackMD.

     

    Thanks for your feedback

    Remove version name

    Do you want to remove this version name and description?

    Transfer ownership

    Transfer to
      Warning: is a public team. If you transfer note to this team, everyone on the web can find and read this note.

        Link with GitHub

        Please authorize HackMD on GitHub
        • Please sign in to GitHub and install the HackMD app on your GitHub repo.
        • HackMD links with GitHub through a GitHub App. You can choose which repo to install our App.
        Learn more  Sign in to GitHub

        Push the note to GitHub Push to GitHub Pull a file from GitHub

          Authorize again
         

        Choose which file to push to

        Select repo
        Refresh Authorize more repos
        Select branch
        Select file
        Select branch
        Choose version(s) to push
        • Save a new version and push
        • Choose from existing versions
        Include title and tags
        Available push count

        Pull from GitHub

         
        File from GitHub
        File from HackMD

        GitHub Link Settings

        File linked

        Linked by
        File path
        Last synced branch
        Available push count

        Danger Zone

        Unlink
        You will no longer receive notification when GitHub file changes after unlink.

        Syncing

        Push failed

        Push successfully