Internet-TCP和UDP协议

一.概念

网络分层:
    应用层:HTTP/WebSocket(Html)、DNS、FTP、SMTP/POP3/IMAP、XMPP/MQTT、TELNET/SSH
    传输层:TCP/UDP(Socket)、DCCP、RTP、PPTP 
    网络层:IP、ICMP(ping)、IGMP、RIP      
    链路层: IP数据报封装成合适在物理层传输的帧格式
    物理层: 实现bit流在结点间传输,既与链路有关,也与传输介质有关

链路层协议MTU(最大传输单元):
    FDDI协议:4352字节
    以太网Ethernet协议:1500字节
    PPPoE(ADSL)协议:1492字节
    X.25协议(Dial Up/Modem):576字节
    Point-to-Point:4470字节

二.区别

若传输层数据大于MTU,则IP协议会分包,IP头部序号使数据包按序重组!    
TCP协议可完成数据分包与重组,数据包在576字节以内,无需IP协议分包!   

若在局域网(以太网协议),UDP数据包最好控制在1472字节以内! 
若在互联网,存在不同链路层协议,最小MTU是576字节,UDP数据包最好控制在576以内!   

TCP协议: 发送数据之前,三次握手建立连接,传输完成,四次挥手断开连接;
        实现数据分包与按序重组
        低效率,但接收数据准确
        java类库: Socket/ServerSocket

UDP协议: 直接发送数据,不建任何连接,不管对方是否收到;
        数据包无序列号,接收端不保证顺序
        高效率,但接收数据包可能丢失或乱序
        java类库: DatagramSocket/DatagramPacket

与HTTP区别:
        HTTP是在TCP连接的基础上,增加了数据封装格式,
        还添加了限制:只能客户端主动请求,服务端不能主动发送(推送)数据,
        我猜早期设计者是为了简化浏览器,毕竟早期浏览器只用来浏览器而已!            
        然而现在网页网罗一切,推送消息就必不可少,如果不断轮询服务器,显然效果差!
        虽然HTTP1.1默认长连接(即不断开TCP连接),但是服务器想主动推送,还是不行!
        因为实现HTTP协议浏览器都没有监听TCP端口,不可能知道服务器主动发了请求!
        所以出现了变相实现推送:服务器收到请求,不响应,需要推送时才响应浏览器!
        此外,Html5新协议WebSocket也是为弥补Http缺少推送而产生的!
                                
        TCP则没有限制,是双向通信,只要知道对方ip端口,双方就可主动发数据(但对方须监听端口)               

三.java使用TCP协议


// TCP客户端
public class TCPClient{
    public static void main(String args[]) throws Exception{
        // 1.输入服务端IP和端口,下载文件路径
        String ip = args[0];
        int port = Integer.parseInt(args[1]);
        String filePath = args[2];
        Socket socket = new Socket(ip, port);
        // 2.建立TCP连接,发送文件路径
        new DataOutputStream(socket.getOutputStream()).writeUTF(filePath);
        // 3.接收文件名,大小,内容
        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, "+
                                "进度"+String.format("%.2f",pro*100f/len)+"%"); 
        }       
        sin.close();
        fou.close();
        socket.close();
    }
}

// TCP服务端
public class TCPServer{
    public static void main(String arg[]) throws Exception{
        // 1.输入服务端监听端口
        String port = arg[0];
        ServerSocket serverSocket = new ServerSocket(Integer.parseInt(port)); 
        while (true) {
            // 2.死循环监听端口,等待客户端请求
            System.out.println("正在监听"+port+"端口。。。\n");
            Socket socket = serverSocket.accept();          
            // 3.TCP连接成功,接收客户端请求文件路径
            String filePath = new DataInputStream(socket.getInputStream()).readUTF();
            File file = new File(filePath);
            FileInputStream fin = new FileInputStream(file);
            System.out.println("TCP连接成功,客户端请求文件路径"+filePath);            
            // 4.发送文件
            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("正在发送文件。。。");
            }
            System.out.println("文件发送完成\n");         
            fin.close();
            sou.close();
            socket.close();
        }
    }
}
    

四.java使用UDP协议


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

// UDP服务端
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.监听端口
            System.out.println("监听等待...");
            dsocket.receive(rec);   // 线程等待, 直到接收到消息                
            // 2.接收数据
            System.out.println("服务端接收:"+new String(rec.getData(), 0, rec.getLength()));
            // 3.发送数据
            byte[] sec = "你好!我是服务端".getBytes("utf-8");
            dsocket.send(new DatagramPacket(sec, sec.length, rec.getAddress(), rec.getPort()));
            System.out.println("服务端响应!");
        }
}

简书: http://www.jianshu.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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容

  • 1.这篇文章不是本人原创的,只是个人为了对这部分知识做一个整理和系统的输出而编辑成的,在此郑重地向本文所引用文章的...
    SOMCENT阅读 13,036评论 6 174
  • 在此特此声明:一下所有链接均来自互联网,在此记录下我的查阅学习历程,感谢各位原创作者的无私奉献 ! 技术一点一点积...
    远航的移动开发历程阅读 11,076评论 12 197
  • 参考:http://www.2cto.com/net/201611/569006.html TCP HTTP UD...
    F麦子阅读 2,938评论 0 14
  • 三月底阳光,总不嫌太明媚。当余晖从你窗户跳进来时,不知迎接;那一束斜阳拘谨的靠在墙边,却又落落大方。毫无保留,让白...
    孙鹏举阅读 153评论 0 0
  • 要努力 不要着急 凡是都是有过程的 【一悟】snapchat 面向对象:年轻人 好的点:阅后即焚 手机上会存各种图...
    毛嘎子阅读 260评论 0 1