您的位置:首页 > 理论基础 > 计算机网络

Java网络编程

xing12138 2019-06-19 07:34 387 查看 https://blog.csdn.net/xing1213

1.OSI七层与TCP/IP四层

图解OSI七层与TCP/IP四层

应表会传网数物

图解每个层使用的协议

2.IP和端口

IP在网络中可以唯一的标识一台计算机,是每一台计算机的标识;一个计算机可能有多个进程,具体和哪个进程通信需要确定的端口来识别。

IP和端口可以唯一定位到某台计算机中需要通信的进程。IP表示地址而不是协议,无论在OSI或者TCP/IP中,IP协议位于网络层,封装IP地址到报文中。

3.Socket

①Socket是网络驱动层提供给应用程序的一种编程接口和机制。Socket是在应用程序中建立的,通过一种绑定机制与驱动程序建立关系,告知对方自己的IP和Port。

②在网络上传输的每一个数据帧,都必须包含发送方的IP地址和端口号。

③创建完Socket后应用程序将数据写入到Socket中,由Socket交给驱动程序向网络上发送数据;计算机从网络上收到与某个Socket绑定的IP和Port相关的数据后,由驱动程序交给Socket,应用程序从这个Socket中读取接收到的数据。

        图解Socket接收数据

      图解Socket发送数据

4.TCP和UDP协议

  • TCP TCP是Transfer Control Protocol传输管理协议,是一种面向连接的保证可靠传输的协议,通过TCP协议传输,得到的是一个顺序的无差错的数据流,提供两台计算机之间的可靠传输。
  • 发送方和接收方的两个Socket必须建立连接,以便在TCP协议的基础上进行通信,当一个Socket等待建立连接时,另一个Socket可以要求进行连接,如果两个Scoket连接成功就可以进行双向数据传输,双方都可以发送或者接收数据。
  • UDP
      UDP是User Datagram Protocol用户数据协议,是一种无连接的协议,每个数据包都是一个独立的信息,包括完整的源地址或者目的地址,在网络上可以以任意的路径传往目的地,因此是否能到达以及到达的时间和内容都是不确定的。
  • 二者比较
      TCP 面向连接,在Socket之间进行数据传输必须建立连接,在TCP中需要连接时间。
    • TCP传输数据无大小限制。
    • TCP是一个可靠的协议,确保接收方完全正确地获取发送方的数据。
  • UDP
      每个数据报中都给出了完整的地址信息,所以无需建立接收方和发送方的连接。
    • UDP传输时有大小限制,在64KB以内。
    • UDP时不可靠传输协议,发送方发送的数据并不一定以相同的次序到达接收方。
  • 应用
      TCP在网络通信上有极强的生命力,例如Tnlnet远程连接、FTP文件传输都需要数据大小不定的不可靠传输,由于检验数据内容的正确需要占用计算机的内存和CPU、带宽,所以TCP的效率没有UDP高。
    • UDP操作简单需要较少的监控,例如视频会议不保证数据的绝对正确只需要连贯性即可。

    5.三次握手

    • 三次握手
        Client客户端发送连接请求报文。
      1. Server接收报文连接后返回ACK报文,并为这次连接分配资源。
      2. Client接收到ACK报文后也向Server端发送ACK报文,并分配资源。
    • 图解三次握手

    • 详解三次握手
        TCP服务端准备接收客户端请求,进入Listen状态。
      1. 客户端发送请求报文SYN=1和序列号seq=x;规定SYN=1的报文不能携带数据但需要消耗一个序列号。
      2. 服务端接收到请求后,发出确认报文ACK=1、SYN=1、seq=y、ack=x+1,服务端也需要自己的序列号seq=y;规定SYN=1的报文不能携带数据但需要消耗一个序列号。
      3. 客户端收到确认后,向服务端发送ACK报文确认ACK=1、seq=x+1(自己的序列号)、ack=y+1,此时连接已经建立;规定ACK报文可以携带数据,如果不携带数据不消耗序列号。
      4. 客户端和服务端建立连接后都处于ESTABLISHED状态。
    • 为什么客户端收到服务端的确认连接后还需要再次发送ACK确认? 为了防止客户端发送失败的请求后突然又发送成功,那么服务端就会同意请求,再次建立连接。
    • 比如:客户端Client发送请求,但因报文丢失或者其他原因没有收到ACK确认,所以客户端再次发送请求,此时服务器端接收到请求返回ACK报文建立连接,然后发送完数据就释放了连接。在这个过程中客户端发送了两次连接第一次发送失败第二次发送成功,但是如果第一个报文只是由网络延迟稍后到达了服务器端,那么服务器端就会认为客户端又发送了请求就会建立连接,然后客户端并不知道服务器端在等待数据,服务器端接收不到数据就会一直等待造成资源浪费。
  • Server容易收到SYN攻击?
      服务端的资源是在二次握手时分配的,客户端的资源是在三次握手时分配的,所有服务端容易受到SYN攻击。
    • SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向服务端不断发送SYN报文,服务端则回复确认ACK包等待客户端确认,由于源地址不存在所以服务端会不断发送直到超时,这些伪造的SYN包会长时间占用未连接队列,导致正常的SYN请求因为队列已满而被抛弃,从而引起网络堵塞甚至系统瘫痪。
    • 防范SYN攻击措施:降低主机的等待时间使主机尽快释放半连接的占用,短时间内收到某IP的重复SYN则丢弃后续请求。

    6.四次挥手

    • 四次挥手 客户端停止发送数据,释放连接发送报文FIN=1、序列号seq=u(等于前面已经传过来的数据的最后一个字节的序号加1),客户端进入FIN-WAIT-1终止等待1状态;TCP规定FIN=1的报文不携带数据也需要消耗一个序列号。
    • 服务端收到请求释放连接,发送ACK确认报文ACK=1、seq=v自己的序列号、ack=u+1,服务端进入CLOSE-WAIT状态。此时处于半关闭状态,客户端不向服务端发送数据,但是如果服务端向客户端发送数据客户端需要接受。
    • 客户端收到服务端的确认后,进入FIN-WAIT-2终止等待2状态,等待服务端发送释放连接的报文,在此之前依然需要接收服务端的数据。
    • 服务端将最后的数据发送完成后,向客户端发送释放连接的报文FIN=1、ack=u+1、seq=w,服务端进入LASK-ACK最后确认状态,等待客户端确认。
    • 客户端收到服务端的释放连接报文后,发出确认报文ACK=1、ack=w+1、自己的序列号seq=u+1,客户端进入TIME-WAIT时间等待状态。此时TCP连接还没有被释放,经过2*MSL最长报文段寿命后进入CLOSED状态。
    • 服务端只要收到客户端的确认立即进入CLOSED状态,所以服务端结束的时间比客户端早一些。
  • 图解四次挥手
    • 为什么客户端最后需要等待2*MSL? TCP允许设置不同的MSL;
    • 为了防止客户端发送的最后一个请求可以到达服务端;
    • 为了防止出现新的请求中出现旧的回复;
  • 为什么是三次握手,四次挥手?
      建立连接的时候服务端处于LISTEN状态,收到建立连接的请求SYN后,把ACK和SYN放在一个报文中发给客户端;
    • 关闭连接时,服务端收到客户端的FIN报文,只表示客户端不发送数据但是依然接收数据,而且服务端也可能有数据需要发送,所以客户端的ACK和FIN需要分开发送,就多了一次。
  • 如果已经成功建立连接,但是客户端挂掉怎么办?

      TCP有一个保活计时器,如果客户端挂掉,服务端不可能一直等待浪费资源。服务端每收到一次请求都会重新复位计时器,如果超过指定时间还没有收到客户端的请求,服务端会发送一个探测报文段,发送探测报文段如果仍然没有反应,服务端认为客户端挂掉了,关闭连接。

    7.网址、域名、ip地址、dns、hosts之间的关系

    • IP:在Internet上有很多个主机,为了区分这些主机,给每一台主机都分配了一个专门的地址称为ip地址,通过ip地址就可以访问到每一个主机;IPv4
  • 标签: