最詳細的Linux終端和Line discipline圖解

line discipline,到底翻譯成行規程還是線路規程,沒有統一的標準,我選用行規程,但這并不意味著操作的單位就是一行,特此澄清。本文我們就和大家分享最詳細的linux終端和line discipline圖解教程,希望能幫助到大家。

什么是行規程

當我們在一個終端上按下按鍵“l”的時候,終端只是把字母“l”回顯了回來,緊接著按下按鍵“s”,依然是回顯字母“s”,隨后我們按下回車鍵,回顯的不再是回車鍵(請問怎么回顯),而是列出并顯示了當前目錄下的所有文件,這些規則是如何定義的?

??當我們按下組合鍵“Ctrl-C”的時候,當前的進程就終止了,這個又是如何規定的?為什么不是組合鍵“Shift-B”來完成同樣的事?

??如果你對鍵盤足夠了解(我了解,但并不足夠),就會知道有很多的組合鍵可以使用,這些組合鍵分別在不同的系統,不同的終端上如何定義的,誰來規定按下什么鍵發生什么事?

??所有這些問題都可以用行規程來回答。那么什么是行規程?

??行規程是一套約定俗成的協議。約定雙方可以是計算機和終端(包括輸出設備和人體輸入設備)。在這個意義上,終端就是所謂的人機接口。

??我來簡單解釋一下。行規程規定了鍵盤,串口,打印機,顯示器等輸入輸出設備和用戶態Shell等程序之間的行為規范,鍵盤上的按鍵事件被行規程解釋成了Shell可以理解的輸入并給出相應的輸出。人們要想操作計算機,這套規程是必不可少的,它事實上規定了信息從外部進入計算機的規范。

??可以使用stty命令來展示你的終端行規程的配置:

最詳細的Linux終端和Line discipline圖解


理解行規程

linux為例,下圖是行規程在整個體系結構中的位置:

最詳細的Linux終端和Line discipline圖解

我們可以看出信息流的方向,是一個縱向的通路,一端是計算機程序,另一端是某種硬件(這里還有偽終端的概念,參見徹底理解Linux的各種終端類型以及概念),作為對比,我們來看看另外一種方向的數據通路,即橫向的通路,典型的例子就是TCP/IP協議棧:

最詳細的Linux終端和Line discipline圖解

TCP/IP協議通信和終端行規程完全不同,終端行規程完全是一個縱向的協議,而TCP/IP則側重于橫向的對等層通信,和終端行規程作為人機接口不同的是,TCP/IP更重要的作用是處理任意進程之間的通信。但抽掉這種數據通路方向上的不同,剩下的東西它們就是一致的了,即它們都是某種約定俗成的協議,約定的雙方是否同質對等造成了唯一的區別。

SLIP的位置

作為一個綜合的例子,我們來看點關于SLIP的內容。

??SLIP就是Serial Line Internet Protocol(串行線路網際協議)可能現在很少有人再使用它了,畢竟現如今都是以太網和光纖的天下了,誰還會用串口線來傳輸網絡數據包。

??但是它在以前很長一段時間一直作為連接運行TCP/IP協議的主機的專用鏈路存在的。

??我們知道,TCP/IP是對等層通信協議,但是最終的數據包不得不通過某種物理介質傳輸,因此還需要一種縱向的協議才可以讓對等層通信得以實現。我們把橫向的對等層協議叫做通信協議,而縱向的協議叫做傳輸協議,行規程事實上就是一種傳輸協議,SLIP實際上就是一種行規程,SLIP行規程把串口線上傳輸的字符解釋成IP數據報文并向上遞送。這種行規程和TCP/IP的關系如下所示:

最詳細的Linux終端和Line discipline圖解

可以看得出,SLIP作為一中行規程,并沒有把解析后的數據繼續提交到與之綁定的TTY緩沖區,而是將解析后的數據作為IP數據報直接遞送給了TCP/IP協議棧來處理。

??這里摘取百度百科上的一段話:

<span style="font-size: 16px;">SLIP只是一個包組幀協議,僅僅定義了在串行線路上將數據包封裝成幀的一系列字符。它沒有提供尋址、包類型標識、錯誤檢查/修正或者壓縮機制。<br/></span>

廣義地來講,其實像以太網規范這種也可以叫做某種行規程,畢竟它也是約定IP層軟件和傳輸介質之間行為規范的協議,起到的均是對數據格式化的作用,但由于如今超高速傳輸早就完完全全基于比特流序列,不再通過定義以字符為邊界的塊來封裝數據,所以再叫做行規程就有點詞不達意了,但本質上都是一樣的,都是定義在某種介質上如何把數據包封裝的協議。


關于unix98偽終端

關于偽終端的這部分內容參見:SVR4/4.3BSD與Linux對待偽終端的不同方式


全局的視角圖解幾種終端

好了,是總結的時候了。

??在上一篇文章徹底理解Linux的各種終端類型以及概念,我是采用環的方式給出了一個關于終端的總圖,后來有人發來郵件反映,所有的終端類型進入一張圖,雖然是很統一,但是太復雜了,所以本文我還是決定把這些分開,略去比較多的細節,在全局的角度來看一下終端的結構。

??站在bash的角度,bash本身并不知道其終端到底是直連的,串口連接的,還是說SSH連過來的,這意味著內核里有一個適配層,在這個層之上,所有的終端看起來是一模一樣的,在這個層以下,卻盡顯個性:

最詳細的Linux終端和Line discipline圖解

我們接下來就看看這些不同點在哪里。

本地終端

最詳細的Linux終端和Line discipline圖解

串口線連接的終端

最詳細的Linux終端和Line discipline圖解

SSH偽終端

最詳細的Linux終端和Line discipline圖解

Tmux偽終端

本來是想把Tmux和Screen一起說的,但是Screen和Tmux原理幾乎是一模一樣,所以就省掉了Screen,這里只說Tmux:

最詳細的Linux終端和Line discipline圖解

還是有點復雜是不是?

??其實確實比較復雜,這里只需要知道兩點就好了,首先,把Tmux Server以及它Fork當作不會斷的SSH就好了,其次,當你在一個SSH偽終端運行Tmux Client的時候,Tmux Client相當于把該SSH偽終端的pts借給了Tmux Server,Tmux Server和SSHd是并列的。

  • Tmux Server打開一對偽終端,自己持有主設備,將次設備繼承給它Fork出來的Bash,此一對進程進入后臺,不再歸屬任何終端。

最詳細的Linux終端和Line discipline圖解

  • 一旦Tmux Client運行于某個SSH終端,它會把當前終端的pts傳遞給Tmux Server,從而讓Tmux Server作為一個數據代理傳遞輸入和輸出。

最詳細的Linux終端和Line discipline圖解

一旦Tmux Client運行,它便成為了當前Bash的前臺進程,通過重定向之后,當前Tmux Client便成為了Bash0的前端,接收Bash0的輸入和輸出。文件句柄轉交后的流程如下:

<span style="font-size: 16px;">1. 有人在遠端的Windows主機上敲入一個字符***“a”***;2. 字符***“a”***經由SSH客戶端加密后傳輸到Linux SSH服務器SSHd并解密;3. 字符***“a”***通過SSHd的ptmx寫入4. Tmux Server從pts/2將字符***“a”***讀出并寫入ptmx;5. Bash0將字符***“a”***從pts/1讀出并執行;6. Bash0將***-bash: a: command not found***按原路返回給Windows。<br/></span>

注釋:關于文件句柄傳遞

有人說Linux可以靠一個ioctl系統調用在不同進程之間傳遞文件描述符,然而當你真的去自己嘗試時,卻發現這是騙人的。那么同樣的功能如何來實現?你如何不通過調用open,accept,socket這類系統調用打開一個文件句柄呢?

??答案就是使用SCM_RIGHTS。具體怎么做,百度一下,你就知道。


題外話

最后,依然說點題外話。

??現如今關于終端等人機接口的內容被淡化了,然而關于TCP/IP的內容卻得到了強化,我認為這是不公平的。

??當然,這是近來不斷提高軟件地位而降低硬件地位的后果,大多數人都知道socket如何到socket,卻只有很少的人知道socket如何到網線,而后者才是基礎。數據從哪里來?

??沒有數據何談通信?數據不可能憑空就存在于計算機,它必然靠某種設備從外界輸入,比如鍵盤,掃描儀,傳感器等,首先這些設備和計算機之間的數據傳輸協議才基礎中的基礎,此后針對數據的加工才會用到TCP/IP,IPC這種對等層通信協議。

??隨著物聯網的發展,關于數據如何進入計算機這個問題還會有很多新的解答,因此以上的局面得以改觀。

牢騷

———————–截止2017/12/16 11:08文章已寫完———————–

東北極寒天吃飯,要亂燉多點肉喝點酒;河南的冷天吃飯,要吃大燴菜,一人盛一碗,陜西山西冷天吃飯,羊排鍋加竹葉青酒超爽…但是現在在華南,深圳的今天氣溫比較低,這天氣說冷不冷,但確實有點寒意,我決定今天穿上長褲…準備出發去吃好爽的火鍋底料。
??華南的深圳,北緯22°不到23°,這是熱帶的邊緣,正因為其地理因素,冬季會受到北方冷空氣的影響,所以這里被歸為一個叫做亞熱帶的尷尬區域,所謂亞熱帶主要就是為了照顧北方的冬天,北方人不是怕冷嗎?那就為北方制造一個叫做亞熱帶的地方,可謂仁慈。不管怎樣,我現在依然還是短衣短褲的…我是迫于眾人的目光壓力穿上長褲的,不然會被認為是傻逼,但是在室內或者剛吃完飯后,真覺得熱…唉!

昨晚的圣誕晚會嗨爆全場,燈光音響很棒,然而最終還是沒有中獎…回到家已經午夜,喝了一瓶真露想再寫篇關于終端的隨筆以解惑,但不知不覺就困了,于是就睡了,早上本來想早起,自然醒來已經七點半了,醒來并沒有意識到今天很冷,第一件事反而是想中午一家人去吃頓川味火鍋底料,這也算是響應老板們的號召了。所以說,我必須在11點前把這篇文章寫完。

??Line discipline,到底翻譯成行規程還是線路規程,沒有統一的標準,我選用行規程,但這并不意味著操作的單位就是一行,特此澄清。

什么是行規程

當我們在一個終端上按下按鍵“l”的時候,終端只是把字母“l”回顯了回來,緊接著按下按鍵“s”,依然是回顯字母“s”,隨后我們按下回車鍵,回顯的不再是回車鍵(請問怎么回顯),而是列出并顯示了當前目錄下的所有文件,這些規則是如何定義的?

??當我們按下組合鍵“Ctrl-C”的時候,當前的進程就終止了,這個又是如何規定的?為什么不是組合鍵“Shift-B”來完成同樣的事?

??如果你對鍵盤足夠了解(我了解,但并不足夠),就會知道有很多的組合鍵可以使用,這些組合鍵分別在不同的系統,不同的終端上如何定義的,誰來規定按下什么鍵發生什么事?

??所有這些問題都可以用行規程來回答。那么什么是行規程?

??行規程是一套約定俗成的協議。約定雙方可以是計算機和終端(包括輸出設備和人體輸入設備)。在這個意義上,終端就是所謂的人機接口。

??我來簡單解釋一下。行規程規定了鍵盤,串口,打印機,顯示器等輸入輸出設備和用戶態Shell等程序之間的行為規范,鍵盤上的按鍵事件被行規程解釋成了Shell可以理解的輸入并給出相應的輸出。人們要想操作計算機,這套規程是必不可少的,它事實上規定了信息從外部進入計算機的規范。

??可以使用stty命令來展示你的終端行規程的配置:

最詳細的Linux終端和Line discipline圖解


理解行規程

以Linux為例,下圖是行規程在整個體系結構中的位置:

最詳細的Linux終端和Line discipline圖解

我們可以看出信息流的方向,是一個縱向的通路,一端是計算機程序,另一端是某種硬件(這里還有偽終端的概念,參見徹底理解Linux的各種終端類型以及概念),作為對比,我們來看看另外一種方向的數據通路,即橫向的通路,典型的例子就是TCP/IP協議棧:

最詳細的Linux終端和Line discipline圖解

TCP/IP協議通信和終端行規程完全不同,終端行規程完全是一個縱向的協議,而TCP/IP則側重于橫向的對等層通信,和終端行規程作為人機接口不同的是,TCP/IP更重要的作用是處理任意進程之間的通信。但抽掉這種數據通路方向上的不同,剩下的東西它們就是一致的了,即它們都是某種約定俗成的協議,約定的雙方是否同質對等造成了唯一的區別。

SLIP的位置

作為一個綜合的例子,我們來看點關于SLIP的內容。

??SLIP就是Serial Line Internet Protocol(串行線路網際協議)可能現在很少有人再使用它了,畢竟現如今都是以太網和光纖的天下了,誰還會用串口線來傳輸網絡數據包。

??但是它在以前很長一段時間一直作為連接運行TCP/IP協議的主機的專用鏈路存在的。

??我們知道,TCP/IP是對等層通信協議,但是最終的數據包不得不通過某種物理介質傳輸,因此還需要一種縱向的協議才可以讓對等層通信得以實現。我們把橫向的對等層協議叫做通信協議,而縱向的協議叫做傳輸協議,行規程事實上就是一種傳輸協議,SLIP實際上就是一種行規程,SLIP行規程把串口線上傳輸的字符解釋成IP數據報文并向上遞送。這種行規程和TCP/IP的關系如下所示:

最詳細的Linux終端和Line discipline圖解

可以看得出,SLIP作為一中行規程,并沒有把解析后的數據繼續提交到與之綁定的TTY緩沖區,而是將解析后的數據作為IP數據報直接遞送給了TCP/IP協議棧來處理。

??這里摘取百度百科上的一段話:

<span style="font-size: 16px;">SLIP只是一個包組幀協議,僅僅定義了在串行線路上將數據包封裝成幀的一系列字符。它沒有提供尋址、包類型標識、錯誤檢查/修正或者壓縮機制。<br/></span>

廣義地來講,其實像以太網規范這種也可以叫做某種行規程,畢竟它也是約定IP層軟件和傳輸介質之間行為規范的協議,起到的均是對數據格式化的作用,但由于如今超高速傳輸早就完完全全基于比特流序列,不再通過定義以字符為邊界的塊來封裝數據,所以再叫做行規程就有點詞不達意了,但本質上都是一樣的,都是定義在某種介質上如何把數據包封裝的協議。


關于unix98偽終端

關于偽終端的這部分內容參見:SVR4/4.3BSD與Linux對待偽終端的不同方式


全局的視角圖解幾種終端

好了,是總結的時候了。

??在上一篇文章徹底理解Linux的各種終端類型以及概念,我是采用環的方式給出了一個關于終端的總圖,后來有人發來郵件反映,所有的終端類型進入一張圖,雖然是很統一,但是太復雜了,所以本文我還是決定把這些分開,略去比較多的細節,在全局的角度來看一下終端的結構。

??站在bash的角度,bash本身并不知道其終端到底是直連的,串口連接的,還是說SSH連過來的,這意味著內核里有一個適配層,在這個層之上,所有的終端看起來是一模一樣的,在這個層以下,卻盡顯個性:

最詳細的Linux終端和Line discipline圖解

我們接下來就看看這些不同點在哪里。

本地終端

最詳細的Linux終端和Line discipline圖解

串口線連接的終端

最詳細的Linux終端和Line discipline圖解

SSH偽終端

最詳細的Linux終端和Line discipline圖解

Tmux偽終端

本來是想把Tmux和Screen一起說的,但是Screen和Tmux原理幾乎是一模一樣,所以就省掉了Screen,這里只說Tmux:

最詳細的Linux終端和Line discipline圖解

還是有點復雜是不是?

??其實確實比較復雜,這里只需要知道兩點就好了,首先,把Tmux Server以及它Fork當作不會斷的SSH就好了,其次,當你在一個SSH偽終端運行Tmux Client的時候,Tmux Client相當于把該SSH偽終端的pts借給了Tmux Server,Tmux Server和SSHd是并列的。

  • Tmux Server打開一對偽終端,自己持有主設備,將次設備繼承給它Fork出來的Bash,此一對進程進入后臺,不再歸屬任何終端。

最詳細的Linux終端和Line discipline圖解

  • 一旦Tmux Client運行于某個SSH終端,它會把當前終端的pts傳遞給Tmux Server,從而讓Tmux Server作為一個數據代理傳遞輸入和輸出。

最詳細的Linux終端和Line discipline圖解

一旦Tmux Client運行,它便成為了當前Bash的前臺進程,通過重定向之后,當前Tmux Client便成為了Bash0的前端,接收Bash0的輸入和輸出。文件句柄轉交后的流程如下:

<span style="font-size: 16px;">1. 有人在遠端的Windows主機上敲入一個字符***“a”***;2. 字符***“a”***經由SSH客戶端加密后傳輸到Linux SSH服務器SSHd并解密;3. 字符***“a”***通過SSHd的ptmx寫入4. Tmux Server從pts/2將字符***“a”***讀出并寫入ptmx;5. Bash0將字符***“a”***從pts/1讀出并執行;6. Bash0將***-bash: a: command not found***按原路返回給Windows。<br/></span>

注釋:關于文件句柄傳遞

有人說Linux可以靠一個ioctl系統調用在不同進程之間傳遞文件描述符,然而當你真的去自己嘗試時,卻發現這是騙人的。那么同樣的功能如何來實現?你如何不通過調用open,accept,socket這類系統調用打開一個文件句柄呢?

??答案就是使用SCM_RIGHTS。具體怎么做,百度一下,你就知道。


題外話

最后,依然說點題外話。

??現如今關于終端等人機接口的內容被淡化了,然而關于TCP/IP的內容卻得到了強化,我認為這是不公平的。

??當然,這是近來不斷提高軟件地位而降低硬件地位的后果,大多數人都知道socket如何到socket,卻只有很少的人知道socket如何到網線,而后者才是基礎。數據從哪里來?

??沒有數據何談通信?數據不可能憑空就存在于計算機,它必然靠某種設備從外界輸入,比如鍵盤,掃描儀,傳感器等,首先這些設備和計算機之間的數據傳輸協議才基礎中的基礎,此后針對數據的加工才會用到TCP/IP,IPC這種對等層通信協議。

??隨著物聯網的發展,關于數據如何進入計算機這個問題還會有很多新的解答,因此以上的局面得以改觀。

相關推薦:

Linux終端類型的詳解

Linux終端類型的詳解

Linux終端類型的詳解

? 版權聲明
THE END
喜歡就支持一下吧
點贊15 分享