Internet-TCP和UDP協(xié)議

一.概念

網(wǎng)絡(luò)分層:
    應(yīng)用層:HTTP/WebSocket(Html)温算、DNS怜校、FTP、SMTP/POP3/IMAP注竿、XMPP/MQTT茄茁、TELNET/SSH
    傳輸層:TCP/UDP(Socket)、DCCP巩割、RTP裙顽、PPTP 
    網(wǎng)絡(luò)層:IP、ICMP(ping)喂分、IGMP锦庸、RIP      
    鏈路層: IP數(shù)據(jù)報(bào)封裝成合適在物理層傳輸?shù)膸袷?    物理層: 實(shí)現(xiàn)bit流在結(jié)點(diǎn)間傳輸,既與鏈路有關(guān),也與傳輸介質(zhì)有關(guān)

鏈路層協(xié)議MTU(最大傳輸單元):
    FDDI協(xié)議:4352字節(jié)
    以太網(wǎng)Ethernet協(xié)議:1500字節(jié)
    PPPoE(ADSL)協(xié)議:1492字節(jié)
    X.25協(xié)議(Dial Up/Modem):576字節(jié)
    Point-to-Point:4470字節(jié)

二.區(qū)別

若傳輸層數(shù)據(jù)大于MTU,則IP協(xié)議會(huì)分包,IP頭部序號(hào)使數(shù)據(jù)包按序重組机蔗!    
TCP協(xié)議可完成數(shù)據(jù)分包與重組,數(shù)據(jù)包在576字節(jié)以內(nèi),無需IP協(xié)議分包蒲祈!   

若在局域網(wǎng)(以太網(wǎng)協(xié)議),UDP數(shù)據(jù)包最好控制在1472字節(jié)以內(nèi)! 
若在互聯(lián)網(wǎng),存在不同鏈路層協(xié)議,最小MTU是576字節(jié),UDP數(shù)據(jù)包最好控制在576以內(nèi)萝嘁!   

TCP協(xié)議: 發(fā)送數(shù)據(jù)之前,三次握手建立連接,傳輸完成,四次揮手?jǐn)嚅_連接;
        實(shí)現(xiàn)數(shù)據(jù)分包與按序重組
        低效率,但接收數(shù)據(jù)準(zhǔn)確
        java類庫: Socket/ServerSocket

UDP協(xié)議: 直接發(fā)送數(shù)據(jù),不建任何連接,不管對(duì)方是否收到;
        數(shù)據(jù)包無序列號(hào),接收端不保證順序
        高效率,但接收數(shù)據(jù)包可能丟失或亂序
        java類庫: DatagramSocket/DatagramPacket

與HTTP區(qū)別:
        HTTP是在TCP連接的基礎(chǔ)上,增加了數(shù)據(jù)封裝格式,
        還添加了限制:只能客戶端主動(dòng)請(qǐng)求,服務(wù)端不能主動(dòng)發(fā)送(推送)數(shù)據(jù),
        我猜早期設(shè)計(jì)者是為了簡化瀏覽器,畢竟早期瀏覽器只用來瀏覽器而已梆掸!            
        然而現(xiàn)在網(wǎng)頁網(wǎng)羅一切,推送消息就必不可少,如果不斷輪詢服務(wù)器,顯然效果差!
        雖然HTTP1.1默認(rèn)長連接(即不斷開TCP連接),但是服務(wù)器想主動(dòng)推送,還是不行!
        因?yàn)閷?shí)現(xiàn)HTTP協(xié)議瀏覽器都沒有監(jiān)聽TCP端口,不可能知道服務(wù)器主動(dòng)發(fā)了請(qǐng)求牙言!
        所以出現(xiàn)了變相實(shí)現(xiàn)推送:服務(wù)器收到請(qǐng)求,不響應(yīng),需要推送時(shí)才響應(yīng)瀏覽器!
        此外酸钦,Html5新協(xié)議WebSocket也是為彌補(bǔ)Http缺少推送而產(chǎn)生的!
                                
        TCP則沒有限制,是雙向通信,只要知道對(duì)方ip端口,雙方就可主動(dòng)發(fā)數(shù)據(jù)(但對(duì)方須監(jiān)聽端口)               

三.java使用TCP協(xié)議


// TCP客戶端
public class TCPClient{
    public static void main(String args[]) throws Exception{
        // 1.輸入服務(wù)端IP和端口咱枉,下載文件路徑
        String ip = args[0];
        int port = Integer.parseInt(args[1]);
        String filePath = args[2];
        Socket socket = new Socket(ip, port);
        // 2.建立TCP連接卑硫,發(fā)送文件路徑
        new DataOutputStream(socket.getOutputStream()).writeUTF(filePath);
        // 3.接收文件名,大小蚕断,內(nèi)容
        DataInputStream sin = new DataInputStream(socket.getInputStream()); 
        FileOutputStream fou = new FileOutputStream(System.currentTimeMillis()+"_"+sin.readUTF());      
        long len = sin.readLong();
        int pro=0;  
        int l; 
        byte[] b = new byte[1024*1024];
        while ((l = sin.read(b)) != -1) {
            fou.write(b,0,l);
            pro += l;
            System.out.println("下載大小"+String.format("%.2f",pro/1024f/1024)+"MB, "+
                                "進(jìn)度"+String.format("%.2f",pro*100f/len)+"%"); 
        }       
        sin.close();
        fou.close();
        socket.close();
    }
}

// TCP服務(wù)端
public class TCPServer{
    public static void main(String arg[]) throws Exception{
        // 1.輸入服務(wù)端監(jiān)聽端口
        String port = arg[0];
        ServerSocket serverSocket = new ServerSocket(Integer.parseInt(port)); 
        while (true) {
            // 2.死循環(huán)監(jiān)聽端口,等待客戶端請(qǐng)求
            System.out.println("正在監(jiān)聽"+port+"端口欢伏。。亿乳。\n");
            Socket socket = serverSocket.accept();          
            // 3.TCP連接成功硝拧,接收客戶端請(qǐng)求文件路徑
            String filePath = new DataInputStream(socket.getInputStream()).readUTF();
            File file = new File(filePath);
            FileInputStream fin = new FileInputStream(file);
            System.out.println("TCP連接成功,客戶端請(qǐng)求文件路徑"+filePath);            
            // 4.發(fā)送文件
            DataOutputStream sou = new DataOutputStream(socket.getOutputStream());          
            sou.writeUTF(file.getName());               
            sou.writeLong(file.length());           
            byte[] b = new byte[1024*1024];
            int l;
            while ((l = fin.read(b)) != -1) {
                sou.write(b, 0, l);
                System.out.println("正在發(fā)送文件葛假。障陶。。");
            }
            System.out.println("文件發(fā)送完成\n");         
            fin.close();
            sou.close();
            socket.close();
        }
    }
}
    

四.java使用UDP協(xié)議


// UDP客戶端
public class UDPClient{
    public static void main(String[] args)throws IOException{
        // 1.直接發(fā)數(shù)據(jù)(不建立連接)
        DatagramSocket dsocket = new DatagramSocket();
        byte[] sen = "你好!我是UDP客戶端".getBytes("utf-8");
        dsocket.send(new DatagramPacket(sen,sen.length,InetAddress.getByName("localhost"),9999));
        System.out.println("客戶端發(fā)送");
        // 2.接收數(shù)據(jù)
        DatagramPacket rec = new DatagramPacket(new byte[100],100);
        dsocket.receive(rec);   
        dsocket.close();
        System.out.println("客戶端接收:" + new String(rec.getData(),0,rec.getLength()));
    }
}

// UDP服務(wù)端
public class UDPServer{
    public static void main(String[] args)throws IOException{           
        DatagramSocket dsocket = new DatagramSocket(9999);
        DatagramPacket rec = new DatagramPacket(new byte[100], 100);            
        while (true) {
            // 1.監(jiān)聽端口
            System.out.println("監(jiān)聽等待...");
            dsocket.receive(rec);   // 線程等待, 直到接收到消息                
            // 2.接收數(shù)據(jù)
            System.out.println("服務(wù)端接收:"+new String(rec.getData(), 0, rec.getLength()));
            // 3.發(fā)送數(shù)據(jù)
            byte[] sec = "你好!我是服務(wù)端".getBytes("utf-8");
            dsocket.send(new DatagramPacket(sec, sec.length, rec.getAddress(), rec.getPort()));
            System.out.println("服務(wù)端響應(yīng)!");
        }
}

簡書: http://www.reibang.com/p/83330e36b4de
CSDN博客: http://blog.csdn.net/qq_32115439/article/details/55798783
GitHub博客:http://lioil.win/2017/02/19/TCP-UDP.html
Coding博客:http://c.lioil.win/2017/02/19/TCP-UDP.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末聊训,一起剝皮案震驚了整個(gè)濱河市抱究,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌带斑,老刑警劉巖鼓寺,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件酿雪,死亡現(xiàn)場離奇詭異,居然都是意外死亡侄刽,警方通過查閱死者的電腦和手機(jī)指黎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來州丹,“玉大人醋安,你說我怎么就攤上這事∧苟荆” “怎么了吓揪?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長所计。 經(jīng)常有香客問我柠辞,道長,這世上最難降的妖魔是什么主胧? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任叭首,我火速辦了婚禮,結(jié)果婚禮上踪栋,老公的妹妹穿的比我還像新娘焙格。我一直安慰自己,他們只是感情好夷都,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布眷唉。 她就那樣靜靜地躺著,像睡著了一般囤官。 火紅的嫁衣襯著肌膚如雪冬阳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天党饮,我揣著相機(jī)與錄音肝陪,去河邊找鬼。 笑死劫谅,一個(gè)胖子當(dāng)著我的面吹牛见坑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播捏检,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼荞驴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了贯城?” 一聲冷哼從身側(cè)響起熊楼,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后鲫骗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體犬耻,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年执泰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了枕磁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡术吝,死狀恐怖计济,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情排苍,我是刑警寧澤沦寂,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站淘衙,受9級(jí)特大地震影響传藏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜彤守,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一毯侦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧遗增,春花似錦叫惊、人聲如沸款青。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抡草。三九已至饰及,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間康震,已是汗流浹背燎含。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留腿短,地道東北人屏箍。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像橘忱,于是被迫代替她去往敵國和親赴魁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1.這篇文章不是本人原創(chuàng)的钝诚,只是個(gè)人為了對(duì)這部分知識(shí)做一個(gè)整理和系統(tǒng)的輸出而編輯成的颖御,在此鄭重地向本文所引用文章的...
    SOMCENT閱讀 13,068評(píng)論 6 174
  • 在此特此聲明:一下所有鏈接均來自互聯(lián)網(wǎng),在此記錄下我的查閱學(xué)習(xí)歷程凝颇,感謝各位原創(chuàng)作者的無私奉獻(xiàn) 潘拱! 技術(shù)一點(diǎn)一點(diǎn)積...
    遠(yuǎn)航的移動(dòng)開發(fā)歷程閱讀 11,118評(píng)論 12 197
  • 參考:http://www.2cto.com/net/201611/569006.html TCP HTTP UD...
    F麥子閱讀 2,949評(píng)論 0 14
  • 三月底陽光,總不嫌太明媚禽最。當(dāng)余暉從你窗戶跳進(jìn)來時(shí)杠茬,不知迎接;那一束斜陽拘謹(jǐn)?shù)目吭趬叧谒妫瑓s又落落大方瓢喉。毫無保留,讓白...
    孫鵬舉閱讀 157評(píng)論 0 0
  • 要努力 不要著急 凡是都是有過程的 【一悟】snapchat 面向?qū)ο螅耗贻p人 好的點(diǎn):閱后即焚 手機(jī)上會(huì)存各種圖...
    毛嘎子閱讀 263評(píng)論 0 1