java开发要不要学tcpip

Python016

java开发要不要学tcpip,第1张

需要学tcpip。

编程语言原本是被设计成专门使用在计算机上的,但它们也可以用来定义算法或者数据结构。正是因为如此,程序员才会试图使程序代码更容易阅读.

TCP协议目前是事实上的网络基础。许多更高层的应用协议HTTP,FTP都基于TCP。

TCP协议的学习可以说枯燥无比,尤其是学生阶段,根本不知道用在什么地方,根本不知道重要性是什么。事实上是,基于目前的网络发展和分布式发展,TCP简直就是基础中的基础。许多网络的问题,配置,入侵,防御乃至架构,都涉及到TCP的具体应用及机制。

以下是我总结的TCP学习过程

1. 了解学习TCP协议的重要性和必要性,了解TCP协议为什么被发展出来

推荐这个问题下的各个回答:TCP/IP 协议到底在讲什么?

2. 学习TCP协议的三次握手以及四次挥手,重点了解为什么要三次握手,为什么要四次挥手,在整个过程中状态是如何变迁的。(经典的状态图以及握手挥手图)

a.为什么要三次握手?不是一次,两次或者四次。我们来论证一下,如果只有一次会发生什么情况,a向b发起连接请求,假设b没收到,则b其实完全不知道a发起了请求,而a也完全不知道b收没收到,所以一次握手是不可靠的如果两次握手呢,a向b发起连接请求,b收到a的请求给a回复一个请求,假设此时a收到了b的回复,a知道了b已经ready了,可b完全不知道a是否ready,有可能a并没有收到b的请求,也有可能收到了,但这些b都完全不知道,所以只是单向的建立了连接如果是四次握手呢,其实第2次让a知道b ready了,第三次让b知道a也ready了,第四次完全就是多余了,会浪费网络资源。

b.为什么要四次挥手?不是3次?实际上两边连接完全可以分开看,用2次挥手断开其中一边连接,用另外2次挥手断开另一边的连接,最终完成整个连接关闭。之所以这样设计,是因为有可能某一边数据还未传输完,连接还未关闭。因为TCP被设计为全双工协议,可以任何一边单向发送数据。

1. 握手及挥手过程

2. TCP的状态转换图

3. 学习TCP协议是如何保持可靠性设计的。

主要目的是用来参考,以便在其他通信场合时用作架构和设计的参考

1).包应答序列号及包重组。

面临的问题:网络传输中,会出现数据的破坏,丢包,重复,分片混乱等问题。

本质上,要想保证传输的可靠性,则需要对传输的内容进行验证。

a. 对于网络数据的破坏(比如宇宙射线影响偷笑导致发射火箭的数据中某一位从0变为1),采取的策略是丢弃重新发送,以确保不会出现致命的错误。TCP在自身协议中单独划了一块checksum用于这种校验,校验算法本质上是将整块数据通过某个函数映射到16位的校验位上(比如用字符相加的和来校验)

b. 对于数据传输正确,但是分片乱序,重复等问题,或是丢包,采取的策略并非丢弃而是自行进行包重组。

考虑两种情况:第一种情况是某个包缺少了,导致整个数据中间缺了一段1000字节,那么如何通知到对方自己少了哪一段数据另一种情况是由于网络或者重发机制的原因导致某一个包收到多次,如何把多余的包都排除掉,仅保留已有数据。

TCP在设计时候充分考虑这点,其中SYN和ACK就是用来确保这个过程的,SYN发送的是字节顺序,ACK则应答收到的字节序加1。这样,无论是发送方还是接收方,都可以准确的维护一张发送接收字节的列表。从而可以知道对方还需要哪些字节,或自己已经接收了哪些字节。

按照下面这篇文章的说法,GetGlyphOutline可以得到文字的位图,那么问题很简单,两次调用这个函数,一次得到你要的轮廓,一次得到位图,而位图里面内容就是你要填充的部分。

http://blog.csdn.net/yusjoel/article/details/5721043

class A {

private int i=1

public int getI(){

return i

}

public void setI(int i){

this.i=i

}

}

public class B extends A {

int i=2

public static void main (String [] args) {

B b = new B()

System.out.println(b.getI())

}

}

又是一个 N 年前我就让在笔记里的题,我又错了

值得反思

举报

0

ddatsh

ddatsh 2011/11/08 16:05

1.并不是private成员不会被继承.事实上子类可以继承父类的任何变量和方法。private、protected只是访问权限而已。即使i是public的

输出结果也肯定是1.

2.方法可以覆盖,成员变量并没有覆盖一说,也就是子类的i和父类的i是共存在子类体内的。父类对象中有i变量、set get两个方法。子类class中应有i【继承于父类对象】、i【子类对象】两个变量、set get两个方法【继承于父类对象】。

3.java中的原则是调用的是哪个类的方法,那么这个方法访问的就是这个类中的成员。子类中没有覆盖public int getI()这个方法的话,那么子类调用的其实是父类的getI()方法.所以返回的是父类中的i.

所以如果子类覆盖了getI()方法,那么就会输出的是子类中的i了,因为调用的是子类中的方法。

评论 (5) 引用此答案 举报

开源中国射线科科长

开源中国射线科科长 2011/11/09 05:39

子类覆盖父类也可以输出1 super.do()就O了 虚拟机其实加载类就是入栈 怎么定义就怎么输出 有heap stack的概念 你就再也不会错了

回复 举报

依剑凌风 2011/11/08 23:39

学习了···

回复 举报

apple.zhou

apple.zhou 2011/11/08 18:09

有帮助~~

回复 举报

艾某 2011/11/08 17:54

分析的很透彻。。。这点也一直是我们初学者的盲点@

回复 举报