关于DNS、socket和port端口的理解

1.DNS
DNS服务器有着相当全的域名和IP,当你输入一串网站的时候,这串网站并不会直接访问,而是先将这个网站发送给DNS服务器,DNS服务器帮你把这串网站变成了IP地址,然后返回给你的电脑,你再访问这个IP地址,这样就解决了IP难记,而域名不能直接访问的问题了。
2.socket
socket是在应用层和传输层之间的一个抽象层,socket本质是编程接口(API),它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用以实现进程在网络中通信。TCP/IP只是一个协议栈,必须要具体实现,同时还要提供对外的操作接口(API),这就是Socket接口。通过Socket,我们才能使用TCP/IP协议。

JDK的java.net包下有两个类:Socket和ServerSocket,在Client和Server建立连接成功后,两端都会产生一个Socket实例,操作这个实例,完成所需的会话,而我们就通过这些API进行网络编程,不需要去关心底层的实现了。 Socket连接过程分为三个步骤:服务器监听,客户端请求,连接确认。

Socket的工作原理
我们只是会用Socekt进行通信的编程了,但socket通信流程究竟是什么样的呢?废话不扯,还是直接上张图来理解吧。

socket是"打开—读/写—关闭"模式的实现。

先来看看客户端和服务器端的实现吧,来分析一下具体步骤!

客户端:

服务器端:

1.服务器端先初始化Socket。( listenfd 从名称看就是为了要监听而创建的socket描述符)

那bind 是干嘛?是为了声明说我要占用这个端口了, 你们都别用了。所以2.绑定端口(bind)

接着 3.listen函数才是真正开始对端口监听了。

接下来是个死循环啊,啊啊也对,因为服务器端需要一直提供服务,只能坐以待命。那这个accept是干啥的呢?

4.调用accept阻塞,等待客户端来连接我。

为什么使用了listenfd , 然后返回了一个新的connfd ? 你还记得服务器要应付很多的客户端发起的连接, 所以它一定得把各个客户端区分开,怎么区分呢? 那只有用一个新的socket来表示, 可以看到后面接受/发送(写和读)消息的操作都是基于connfd 来做的。 至于之前的listenfd , 它只起到一个大门的作用了, 意思是说,欢迎敲门, 进门之后我将为你生成一个独一无二的socket描述符!(引子张大胖的Socekt,o((⊙﹏⊙))o.)

这时有个客户端初始化一个Socket,然后5.该客户端连接服务器(connect),连接成功则建立连接。此时服务器的accept 相当于和客户端的connect 一起完成了TCP的三次握手 !

连接建立以后6.客户端发送发送数据请求 7.服务器接收请求并处理,然后回应数据给客户端 8.客户端读取到的数据,最后关闭连接。 这样一次完整的交互就结束了。

还有一个问题就是socket指的是 (IP, Port), 现在我已经有了一个listenfd 的socket, 端口是80 然后每次客户端发起连接还要创建新的connfd, 因为80端口已经被占用,难道服务器端会为每个连接都创建新的端口吗?

其实新创建的connfd 并没有使用新的端口号,也是用的80, (在实现聊天室的时候,我们只是为每一个客户端的连接单独创建一个线程去处理,但并没有为每个连接都创建新的端口。然而这样处理是有漏洞的,昨晚就被问到了(′д` )…彡…彡,然后我想了下也是,如果客户端很多,那这样做服务器不得崩了才怪,那怎么解决了?我答了下用线程池吧…又扯了)

因为可以这么理解,这个socket描述符指向一个数据结构, 例如 listenfd 指向的结构是这样的:

而一旦accept 新的连接, 新的connfd 就会生成, 像下面的表格, 就生成了两个connfd , 它们俩服务器端的ip和port都是相同的, 但是客户端的IP和Port是不同的, 自然就可以区分开来了。

所以socket 得通过五元组(协议, 客户端IP, 客户端Port, 服务器端IP, 服务器端Port)来确定。

原文链接:https://blog.csdn.net/ziyonghong/article/details/83663403

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值