Socket浅析通信原理和java编程(二)

内容从Socket浅析通信原理和java编程(一)(4)开始

4 socket源码浅析客户端和服务器端的连接过程。

(1)socket服务器端和客户端的创建和连接过程
下面三句代码:服务器端创建服务器Socket,然后服务器端调用accpet()方法,服务器端就可以接收用户的请求了。客户端指定要访问的IP和端口号,就可以向指定的服务器进行通信了。

//创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
ServerSocket serverSocket = new ServerSocket(10086);
// 调用accept()方法开始监听,等待客户端的连接
Socket socket = serverSocket.accept();
//创建客户端Socket,指定服务器地址和端口
Socket socket = new Socket("localhost", 10086);

(2)socket服务端创建到准备接收请求的过程:服务器或者应用进程通过协议+端口号去确认一个服务器或者应用进程,通过IP地址确定一个主机。

1)首先创建socket服务器,指定服务器端口号port。

//创建socket服务器的三种方式。
 public ServerSocket(int port);//主要说这个创建方式
 public ServerSocket(int port, int backlog)//backlog连接数量
 //端口号-连接数量-IP地址
 public ServerSocket(int port, int backlog, InetAddress bindAddr);

2)调用bind()方法,将服务器的IP地址和端口号绑定,同时设定可以接收客户端的连接数量(backlog)。

protected abstract void bind(InetAddress host, int port) throws IOException;

3)调用listen()方法,将new出来的socket主动型设置为被动形式,count为监听的最大连接数量。

  protected synchronized void listen(int count) throws IOException {
        socketListen(count);
    }

4)调用accept()方法,服务器端就可以开始接收用的请求了。

(3)客户端连接服务器端的过程:
1)创建socket,连接指定的端口和IP地址。

private Socket(SocketAddress address, SocketAddress localAddr,
                   boolean stream)

2)调用bind()方法,虽然客户端没有指定端口号和IP地址,但是系统会将本地的IP地址和随机产生的端口号绑定,以便于接收服务器端的应答,如果客户端不自我绑定,客户端就收不到服务器的应答,包括三次握手和四次挥手的过程。

protected abstract void bind(InetAddress host, int port) throws IOException;

3)调用connect()方法,连接指定的IP地址和端口号。相当于客户端主要向服务器发送连接请求。

public void connect(SocketAddress endpoint, int timeout)

(4)套接字数据结构:
每台主机可能有多个应用进程,所以可能出现多个套接字(端口号范围为0-65535,其中0-1023位为系统保留,我认为保留的套接字就是为了应用进程发出socket系统调用时使用),需要一个存放套接字描述符的表(操作系统将应用进程所需要的资源的总和称为套接字描述符返回给应用进程),每一个套接字描述符有一个指向存放操作地址的地址。
PF_INET:表示使用internet的TCP/IP协议族。
SOCK_STREAM:表示流式服务,也就是TCP服务。
这里写图片描述
指定了本地地址和端口号、远程地址和端口号,这样客户端和服务器端的通信便畅通无阻!!!

5 socket在TCP三次握手中的建立连接过程。

我们知道tcp建立连接要进行“三次握手”,即交换三个分组。大致流程如下:

客户端向服务器发送一个SYN J
服务器向客户端响应一个SYN K,并对SYN J进行确认ACK J+1
客户端再想服务器发一个确认ACK K+1。
这里写图片描述
从图中可以看出,当客户端调用connect时,触发了连接请求,向服务器发送了SYN J包,这时connect进入阻塞状态;服务器监听到连接请求,即收到SYN J包,调用accept函数接收请求向客户端发送SYN K ,ACK J+1,这时accept进入阻塞状态;客户端收到服务器的SYN K ,ACK J+1之后,这时connect返回,并对SYN K进行确认;服务器收到ACK K+1时,accept返回,至此三次握手完毕,连接建立。

总结:客户端的connect在三次握手的第二个次返回,而服务器端的accept在三次握手的第三次返回。

6 socket在TCP四次挥手中的释放过程。

上面介绍了socket中TCP的三次握手建立过程。现在我们介绍socket中的四次握手释放连接的过程,请看下图:
这里写图片描述
某个应用进程首先调用close主动关闭连接,这时TCP发送一个FIN M;
另一端接收到FIN M之后,执行被动关闭,对这个FIN进行确认。它的接收也作为文件结束符传递给应用进程,因为FIN的接收意味着应用进程在相应的连接上再也接收不到额外数据;
一段时间之后,接收到文件结束符的应用进程调用close关闭它的socket。这导致它的TCP也发送一个FIN N;
接收到这个FIN的源发送端TCP对它进行确认。
这样每个方向上都有一个FIN和ACK。

参考博客地址:
http://blog.csdn.net/jiajia4336/article/details/8798421
http://www.cnblogs.com/rocomp/p/4790340.html
参考书籍:计算机网络-谢希仁第五版

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值