<浅出> 熟悉TCP/IP协

前言

  由于非CS科班出身,没有系统学过操作系统或微机原理,所以对计算机底层一直不是特别明白,所以在用到java网络编程的时候就头大,虽然知道socket怎么用,能搭建个B/S联通起来,但是socket到底是什么还是一概莫知。这篇随笔就当是让自己多了解一点这方面的知识吧。

OSI七层模型

  首先,做一件事情最重要的是知道目的(why)。那么我们的目的就是让两台主机相互通信,只有让两台能通信,才能形成现在的互联网。

  其次,做一件事情要知道怎么做(how)。想象一下两边放着两台电脑,让它们通信(也就是数据交换),那数据又不可能通过空气传播过去(当然我不了解手机和wifi是什么情况),所以肯定需要最最底层的东西,一条数据传输线,不管它现实中叫光纤也好电缆也好继电器也好,这就是OSI七层中最下一层--物理层。相当于我们两个人之间要交流,首先你得有喉咙舌头这些东西。

  然后,要发送数据的主机开始物理地址寻址,数据帧的形成,数据的检验,这就是七层中的第二层--数据链路层。相当于两个人交流,其中准备要说话的那个组织下语言,并清了清嗓子。

  然后,准备工作做好,下一步就是找到发送目标,也就是寻找合适的网间路由和交换节点,并从刚才的数据帧中提取出数据包包头,里面有目的站点的网络地址,这层里面的代表协议就是大名鼎鼎的IP协议,这就是OSI七层的第三层--网络层。相当于两个人交流,得一个找一个合适的地点,咖啡厅什么的。

  然后,数据准备好,目标也有了,那就开始传输数据,这就没什么好解释的了,这层的代表协议就是我们后面要讲的TCP协议,这就是OSI七层中的第四次--传输层,这层是前三层和后上层的桥梁,非常重要。相当于两个人找到地方坐下来,其中一个人开始滔滔不绝的开讲了。

  然后,后面就简单说一下,你说话的时候,别人不一定一直在那听啊,那么需要有东西保证两个是一直在会话的,这就是第五层--会话层

  然后,说话的时候,两个人有相互表达不清楚的时候,或者想描绘个图什么的,这需要有东西保证将表达不清楚的解释清楚,将描绘的画下来给对方,这就是第六层--表示层

  最后,将前面流程形成一套接口,做成应用,如果另外两个也想交流呢,就利用这套接口,改点东西,比如我在垃圾场见面啦,说的是郭嘉政治啦,他在汽车站见面啦,说的是天气真热什么的,再比如:HTTP、FTP、Telnet等,这就是最后一层--应用层  

  写到后面发现例子举的不太合适了,也是强行圆下去。?(‾??)

Socket是什么

  一般的麻瓜用的是第七层,比如点下网页的连接,它就发送了一个HTTP请求,当然他们看不到,请求报文是浏览器给他们写的,而我们程序员一般是从第四层的TCP开始用,怎么用呢,TCP有提供接口,就是Socket。它对TCP/IP协议做了抽象,也就有了create、connect、write、send、accept、close等等方法。

socket连接有个很重要的特性,就是三次握手,有必要写一下:

Client向Server发送一个Syn包(syn=j),并进入SYN_SEND状态(Syn是Synchronize Sequence Numbers同步序列号)

Server接收到确认Syn包(Syn=j+1),加上一个自己的Ack包(ack=k),然后一起发送回去,并进入SYN_RECV状态(Ack是acknowledge确认)

Client接收到两个包,并将Ack包(Ack=k+1)再次返回给Server,发送完毕后两边都进入Established状态。完成握手。

  HTTP是TCP的一个非常重要的引用,也是互联网的基础,下次再说。至于TCP和UDP的区别我就不赘述了,而且我也没用过UDP。

实例

  下面给一个最简单的Socket连接示例。

 1 public class DateServer {
 2     public static void main(String[] args) throws IOException {
 3         ServerSocket listener = new ServerSocket(9090);
 4         try {
 5             while (true) {
 6                 Socket socket = listener.accept();
 7                 try {
 8                     PrintWriter out =
 9                         new PrintWriter(socket.getOutputStream(), true);
10                     out.println(new Date().toString());
11                 } finally {
12                     socket.close();
13                 }
14             }
15         }
16         finally {
17             listener.close();
18         }
19     }
20 }
21 public class DateClient {
22     public static void main(String[] args) throws IOException {
23         String serverAddress = JOptionPane.showInputDialog(
24             "Enter IP Address of a machine that is\n" +
25             "running the date service on port 9090:");
26         Socket s = new Socket(serverAddress, 9090);
27         BufferedReader input =
28             new BufferedReader(new InputStreamReader(s.getInputStream()));
29         String answer = input.readLine();
30         JOptionPane.showMessageDialog(null, answer);
31         System.exit(0);
32     }
33 }

推荐

  最后推荐一个基于java nio的Socket框架--Mina,非常强大,而且刚好这次的项目用上了,之后有时间就来写下mina好了。

时间: 2024-10-09 14:56:47

<浅出> 熟悉TCP/IP协的相关文章

二:熟悉 TCP/IP 协议

一篇文章带你熟悉 TCP/IP 协议(网络协议篇二) 同样的,本文篇幅也比较长,先来一张思维导图,带大家过一遍. 一图看完本文 一. 计算机网络体系结构分层 计算机网络体系结构分层计算机网络体系结构分层不难看出,TCP/IP 与 OSI 在分层模块上稍有区别.OSI 参考模型注重“通信协议必要的功能是什么”,而 TCP/IP 则更强调“在计算机上实现协议应该开发哪种程序”. 二. TCP/IP 基础 1. TCP/IP 的具体含义 从字面意义上讲,有人可能会认为 TCP/IP 是指 TCP 和

Http TCP/IP协议和socket之间的区别和联系

总结,TCP/IP是传输层协议,主要解决数据如何在网路中传输,socket是TCP/IP协议的具体实现,是对TCP/IP协议的封装和应用,属于程序员层面,HTTP是应用层协议,应用层协议很多,类似的像HTTP.FTP.Telnet. 传输层协议和应用层协议的区别和分工可以用下面的一段话做总结: "我们在传输数据时,可以只使用(传输层)TCP/IP协议,但是那样的话,如 果没有应用层,便无法识别数据内容,如果想要使传输的数据有意义,则必须使用到应用层协议,应用层协议有很多,比如HTTP.FTP.T

如何才能算得上熟悉TCP/IP编程?(转知乎)

1. 作者:匿名用户链接:https://www.zhihu.com/question/20795067/answer/16259037 能进行网络编程 1.如果你说你会select,epoll,iocp模型,那会让对方觉得更靠谱2.如果你说出你做过im,下载之类那会让对方来兴趣.3.如果你说设计了通讯协议,会让对方觉得更贴切4.如果你说做过,熟悉, ftp http snmp smtp 这些简单的老古董协议,会加分,但不大.5.如果你说熟悉bt,emule,udt等协议,那会对你很有好感.6.

TCP/IP协议和OSI参考模型

对TCP/IP网络协议的深入浅出归纳

前段时间做了一个开发,涉及到网络编程,开发过程比较顺利,但任务完成后始终觉得有一些疑惑.主要是因为对网络协议不太熟悉,对一些概念也没弄清楚.后来 我花了一些时间去了解这些网络协议,现在对TCP/IP网络协议有了初步的认识,在这里总结出来,可以梳理一下我对网络协议的理解,加深印象. 话说两台电脑要通讯就必须遵守共同的规则,就好比两个人要沟通就必须使用共同的语言一样.一个只懂英语的人,和一个只懂中文的人由于没有共同的语言(规则)就没办法沟通.两台电脑之间进行通讯所共同遵守的规则,就是网络协议. 那么

iOS网络协议----HTTP/TCP/IP浅析

一.TCP/IP协议 话说两台电脑要通讯就必须遵守共同的规则,就好比两个人要沟通就必须使用共同的语言一样.一个只懂英语的人,和一个只懂中文的人由于没有共同的语言(规则)就没办法沟通.两台电脑之间进行通讯所共同遵守的规则,就是网络协议. 那么谁来制定这个网络协议? 国际标准化组织(ISO)定义了网络协议的基本框架,被称为OSI模型.要制定通讯规则,内容会很多,比如要考虑A电脑如何找到B电脑,A电脑在发送信息 给B电脑时是否需要B电脑进行反馈,A电脑传送给B电脑的数据的格式又是怎样的?内容太多太杂,

对TCP/IP网络协议的深入浅出归纳(转)

前段时间做了一个开发,涉及到网络编程,开发过程比较顺利,但任务完成后始终觉得有一些疑惑.主要是因为对网络协议不太熟悉,对一些概念也没弄清楚.后来 我花了一些时间去了解这些网络协议,现在对TCP/IP网络协议有了初步的认识,在这里总结出来,可以梳理一下我对网络协议的理解,加深印象. 话说两台电脑要通讯就必须遵守共同的规则,就好比两个人要沟通就必须使用共同的语言一样.一个只懂英语的人,和一个只懂中文的人由于没有共同的语言(规则)就没办法沟通.两台电脑之间进行通讯所共同遵守的规则,就是网络协议. 那么

[转]对TCP/IP网络协议的深入浅出归纳

转自:http://blog.jobbole.com/74795/ 前段时间做了一个开发,涉及到网络编程,开发过程比较顺利,但任务完成后始终觉得有一些疑惑.主要是因为对网络协议不太熟悉,对一些概念也没弄清楚.后来 我花了一些时间去了解这些网络协议,现在对TCP/IP网络协议有了初步的认识,在这里总结出来,可以梳理一下我对网络协议的理解,加深印象. 话说两台电脑要通讯就必须遵守共同的规则,就好比两个人要沟通就必须使用共同的语言一样.一个只懂英语的人,和一个只懂中文的人由于没有共同的语言(规则)就没

关于TCP/IP [本文发表于《程序员》杂志2003年第12期,作者孟岩]

基于TCP/IP的编程格外重要.从应用上来说,现在直接利用C层次Socket API进行TCP/IP编程的人确实越来越少了,各种现成的框架(如ACE.Java..NET FCL)和控件(如IP*Works)大大简化了TCP/IP编程的难度.高层的框架和控件总结了TCP/IP的主要使用模式,并且进行了抽象和封装,这固然非常好,但是想要真正掌握TCP/IP网络编程的真谛,恐怕需要认真学习下面几本著作. [ 查看本指南所提及的书籍 ] [本文发表于<程序员>杂志2003年第12期,作者孟岩] TCP