java网络通信:TCP协议

  面试的时候,面试官由于需要考察一个面试人对于网络编程的熟悉程度,往往会考察学生对于TCP、HTTP、UDP、这些常见的网络编程当中的协议的了解程度,而TCP协议则是首当其冲的,作为进程之间通信常用的一种协议,只要岗位涉及到了进程之间的相互通信,则一定会被询问到TCP协议,那么本篇就来总结一下TCP协议吧~

  TCP协议在OSI七层模型当中,是属于传输层的协议,它是一种可靠传输的协议,这个可靠,指的是TCP可以确保通信信息不会因为网络因素导致丢包,确保接受方一定可以接受到完整的数据。在TCP可靠传输方面,常常与另一个协议——UDP协议进行对比,我们通过两者的对比,先大体对TCP协议有些了解。

1.TCP和UDP的异同点

1)tcp是面向连接的,而udp则是不需要建立连接的。

2)tcp是面向字节流的,而udp则是面向数据报的。这话的理解是udp发送的报文长度是进程给出的,而TCP发送的报文长度,则是根据对方的接受窗口和当前网络的情况决定的。可以想象TCP是按流传输,而udp是按一个一个报文进行传输的。

3)tcp是可靠传输,而udp是尽最大可能交付的协议,tcp的可靠传输主要是通过滑动窗口和发送-确认-窗口滑动机制,来确保的,而udp就是尽可能发送,不确保发送的数据是否到达的。

4)tcp是一对一的全双工的通信,而udp可以一对一,一对多,多对一,多对多的通信。

5)tcp具有流量控制,拥塞控制机制,而udp没有。

  从上述的比较,可以大体把握了TCP是一个什么样的协议,那么接下来,我们来看看在面试当中涉及到TCP协议的话,必要考的一个考点,TCP的三次握手和四次挥手。

2.TCP的三次握手和四次挥手

  tcp是面向连接的协议,那么两个进程需要通过tcp进行交互的时候,需要首先建立连接,这个建立连接的过程,需要来回三次通信,所以顾名思义,被较为了三次握手,那么这三次握手是一个什么样的流程?首先我们来看一下图。

在图中,着重关注几个点,Client和Server的状态变化、标志位的置1、发送序号的数字。

  首先我们要发起连接请求的进程称之为Client,而被动接收连接请求的称之为Server,Server和Client在发起连接请求之前,都会创建TBC(传输控制块),这时候Server将进入监听(Listen)状态,而Client建立TCB之后,将发送连接请求。

  Client将要发送的TCP报文当中的SYN标志位置1,并且在发送序号置为了x,发送到Server,这时候Client将进入SYN_SENT(同步已发送)状态。

  Server接收到后,向Client回复一个SYN标志位也置1,ACK标志位置1,发送序号为:y,而确认序号为:x+1   的tcp报文,这时候Server将进入SYN_RCVD(同步接收)状态

  Client接收到Server的回复报文之后,再回复一个ACK标志位置1,发送序号为x+1,确认序号为:y+1    的tcp报文,这时候Client和Server都同时进入ESTABLISH状态,连接建立。

想面试官讲解完三次握手之后,面试官可能会问出一个常规的延伸问题,为什么是三次握手,而不是两次握手呢

  这是为了防止Client已失效的连接请求报文突然又传到了Server,产生错误。举个例子详细来说,Client发送连接请求,但是因为连接请求的报文丢失而未收到确认,于是Client又一次重传了一次连接请求,后来收到了确认,然后建立了连接,数据传输完毕后,释放了连接。而第一个连接请求这时候到达了Server,Server收到了报文之后,误认为Client需要再次建立连接,就会回复这个连接请求,而这时候由于实际上Client这时候并没有发起请求,所以Client会忽略这个回复,而如果采用的是两次握手,这时候Server就已经进入建立连接的状态,白白的浪费了资源。而采用三次握手,Server就不会收到回复,则就表明这是一个无效的连接,就会中断。

时间: 2024-11-04 00:48:56

java网络通信:TCP协议的相关文章

Java-->实现群聊功能(C/S模式--TCP协议)

--> Java 对TCP协议的支持: --> java.net包中定义了两个类ServerSocket 和Socket ,分别用来实现双向连接的server 端和client 端. --> Client 类定义客户端 package com.dragon.java.tcpchat; import java.io.IOException; import java.net.Socket; import java.net.UnknownHostException; /** * 客户端 * *

基于TCP协议的网络通信

**重点内容**1.使用InetAddress(IP地址类) 这个类有点儿奇葩,没有提供构造方法.而是有两个静态方法来实例化. ·getByName(String host) 通过主机名获取对应的InetAddress对象 ·getByAddress(byte[] addr) 通过IP地址获取对应的InetAddress对象 getCononicalHostName() 获取IP地址的全限定域名 getHostAddress() 返回IP地址字符串 getHostName() 获取IP地址的主机

java学习--基础知识进阶第十二天--网络编程概述、UDP协议、TCP协议

今日内容介绍 u  网络编程概述 u  UDP u  TCP 第1章 网络编程概述 1.1 网络协议 通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则,这就好比在道路中行驶的汽车一定要遵守交通规则一样.在计算机网络中,这些连接和通信的规则被称为网络通信协议,它对数据的传输格式.传输速率.传输步骤等做了统一规定,通信双方必须同时遵守才能完成数据交换. 网络通信协议有很多种,目前应用最广泛的是TCP/IP协议(Transmission Contro

Java中的基于Tcp协议的网络编程

一:网络通信的三要素? IP地址     端口号     通信协议 IP地址:是网络中设备的通信地址.由于IP地址不易记忆,故可以使用主机名.本地环回地址,127.0.0.1   本地主机名localhost 端口号:发送端准备的数据要发送到指定的目的应用程序上,为了标识这些应用程序,所以用网络数字来标识这些不同的应用程序,这些数 字称为端口号.端口号是不同进程之间的标识.一般来说,有0~65535的端口可供使用,但是1~1024系统使用,或者称作保留端口. 通信协议:指定义的通信规则,这个规则

Java基础知识强化之网络编程笔记06:TCP之TCP协议发送数据 和 接收数据

1. TCP协议发送数据 和 接收数据 TCP协议接收数据:• 创建接收端的Socket对象• 监听客户端连接.返回一个对应的Socket对象• 获取输入流,读取数据显示在控制台• 释放资源 TCP协议发送数据: • 创建发送端的Socket对象• 这一步如果成功,就说明连接已经建立成功了.• 获取输出流,写数据• 释放资源 2. 代码实现: (1)发送端: 1 package cn.itcast_06; 2 3 import java.io.IOException; 4 import java

Java基础知识强化之网络编程笔记13:TCP之TCP协议上传图片并给出反馈

1. TCP协议上传图片并给出反馈: (1)客户端: 1 package cn.itcast_13; 2 3 import java.io.BufferedInputStream; 4 import java.io.BufferedOutputStream; 5 import java.io.FileInputStream; 6 import java.io.IOException; 7 import java.io.InputStream; 8 import java.net.Socket;

基于TCP协议的简单Socket通信笔记(JAVA)

好久没写博客了,前段时间忙于做项目,耽误了些时间,今天开始继续写起~ 今天来讲下关于Socket通信的简单应用,关于什么是Socket以及一些网络编程的基础,这里就不提了,只记录最简单易懂实用的东西. 1.首先先来看下基于TCP协议Socket服务端和客户端的通信模型: Socket通信步骤:(简单分为4步) 1.建立服务端ServerSocket和客户端Socket 2.打开连接到Socket的输出输入流 3.按照协议进行读写操作 4.关闭相对应的资源 2.相关联的API: 1.首先先来看下S

12.2-全栈Java笔记: TCP协议和UDP协议

 区别 在网络通讯中,TCP方式就类似于拨打电话,使用该种方式进行网络通讯时,需要建立专门的虚拟连接,然后进行可靠的数据传输,如果数据发送失败,则客户端会自动重发该数据.而UDP方式就类似于发送短信,使用这种方式进行网络通讯时,不需要建立专门的虚拟连接,传输也不是很可靠,如果发送失败则客户端无法获得. 这两种传输方式都是实际的网络编程中进行使用,重要的数据一般使用TCP方式进行数据传输,而大量的非核心数据则都通过UDP方式进行传递,在一些程序中甚至结合使用这两种方式进行数据的传递. 由于TCP需

Java通信编程中调用UDP协议与TCP协议之间的不同

UDP协议与TCP协议之间的区别不再分析,主要是分析一下这两个协议在Java通信编程中是如何被使用的. 首先介绍TCP,对于TCP,Java语言为它提供了良好的支持.建立TCP通信,首先需要构建服务器,并且得 到服务器的IP和端口号. TCP协议下的Socket类: java.net.Socket类代表客户端连接 java.net.ServerSocket类代表服务器端连接 Server:ServerSocket ss = new ServerSocket(5000); //创建服务器端的soc