accept

访问一个网页的全过程

半腔热情 提交于 2020-03-07 02:59:55
访问一个网页的全过程 原创toumingren527 最后发布于2017-12-08 18:03:35 阅读数 33418 收藏 展开 引言 打开浏览器,在地址栏输入URL,回车,出现网页内容。整个过程发生了什么?其中的原理是什么?以下进行整理和总结。 整个过程可以概括为几下几个部分: 域名解析成IP地址; 与目的主机进行TCP连接(三次握手); 发送与收取数据(浏览器与目的主机开始HTTP访问过程); 与目的主机断开TCP连接(四次挥手); 正文 下面详细介绍其中的原理: 域名解析成IP地址 访问目标地址有两种方式: ①使用目标IP地址访问。由于IP地址是一堆数字不方便记忆,于是有了域名这种字符型标识。 ②使用域名访问。域名解析就是域名到IP地址的转换过程,域名的解析工作由DNS服务器完成。 DNS域名解析时用的是UDP协议。整个域名解析的过程如下: 浏览器向本机DNS模块发出DNS请求,DNS模块生成相关的DNS报文; DNS模块将生成的DNS报文传递给传输层的UDP协议单元; UDP协议单元将该数据封装成UDP数据报,传递给网络层的IP协议单元; IP协议单元将该数据封装成IP数据包,其目的IP地址为DNS服务器的IP地址; 封装好的IP数据包将传递给数据链路层的协议单元进行发送; 发送时在ARP缓存中查询相关数据,如果没有,就发送ARP广播(包含待查询的IP地址

Linux TCP server系列(4)-浅谈listen与大并发TCP连接

牧云@^-^@ 提交于 2020-03-06 04:39:37
背景: 服务器在调用 listen 和 accept 后,就会阻塞在 accept 函数上, accpet 函数返回后循环调用 accept 函数等待客户的 TCP 连接。如果这时候又大量的用户并发发起 connect 连接,那么在 listen 有队列上限 ( 最大可接受 TCP 的连接数 ) 的情况下,有多少个 connect 会成功了。试验证明,当连接数远远高于 listen 的可连接数上限时,客户端的大部分 TCP 请求会被抛弃,只有当 listen 监听队列空闲或者放弃某个连接时,才可以接收新的连接,那么我们应该如何来避免这种情况出现? 分析: (一)客户端 客户端运行初期完成所设定的一定量的 socket 创建和相应的处理线程的创建 ,然后使用 条件变量来完成线程同步 ,直到最后一个线程创建完成,才 向所有线程发出广播通知,让所有线程并发调用 connect ,连接成功则关闭连接,失败则返回,如下代码所示。 socket 创建和线程创建: int testCount=300; // 并发用户数 /* 每个进程需要自己独立的栈空间, linux 下默认栈大小是 10M ,在 32 位的机子上一个进程需要 4G 的内存空间,去掉自己的栈空间全局程序段空间,一般只有 3G 内存可以用,创建线程时就需要从这 3G 的空间中分配 10M 出来,所以最多可以分配 300 个线程

socket编程listen函数限制连接数的解决方案

大憨熊 提交于 2020-03-06 04:36:49
函数原型: int listen(int sockfd, int backlog); 当服务器编程时,经常需要限制客户端的连接个数,下面为问题分析以及解决办法: 下面只讨论TCP UDP不做讨论(很少使用到listen函数)   listen函数用法:函数应该在调用socket和bind这两个函数之后,accept函数之前调用。   listen函数作用:让服务器套接字sockfd进入监听状态。 1.返回值:   成功返回0;   失败返回-1。 2.参数:   sockfd:套接字,成功返回后进入监听模式,当有新连接并accept后会再建立一个套接字保存新的连接;   backlog:暂且翻译为后备连接吧!下面详细介绍此参数:   1) 当TCP接收一个连接后(三次握手通过)会将此连接存在连接请求队列里面,并对队列个数+1,而backlog为此队列允许的最大个数,超过此值,则直接将新的连接删除,即不在接收新的连接。将这些处于请求队列里面的连接暂记为后备连接,这些都在底层自动完成,底层将连接添加到队列后等待上层来处理(一般是调用accept函数接收连接);   2) 当上层调用accept函数接收一个连接(处于请求队列里面的后备连接),队列个数会-1;   3) 那么这样一个加一个减,只要底层提交的速度小于上层接收的速度(一般是这样),很明显backlog就不能限制连接的个数

accept函数

纵饮孤独 提交于 2020-03-06 04:34:49
文件包含 #include <sys/socket.h> 原型 SOCKET PASCAL FAR accept( SOCKET s, struct sockaddr FAR* addr,int FAR* addrlen); 参数 s:套接口描述字,该套接口在 listen() 后监听连接。 addr:(可选)指针,指向一缓冲区,其中接收为通讯层所知的连接实体的地址。Addr参数的实际格式由套接口创建时所产生的地址族确定。 addrlen:(可选)指针,输入参数,配合addr一起使用,指向存有addr地址长度的整型数。 返回值 成功返回一个新的套接字描述符,失败返回-1。 本 函数 从 s的等待连接队列中抽取第一个连接,创建一个与s同类的新的套接口并返回句柄。如果队列中无等待连接,且套接口为阻塞方式,则accept()阻塞调用进 程直至新的连接出现。如果套接口为非阻塞方式且队列中无等待连接,则accept()返回一错误代码。已接受连接的套接口不能用于接受新的连接,原套接口 仍保持开放。 addr参数为一个返回参数,其中填写的是为通讯层所知的连接实体地址。addr参数的实际格式由通讯时产生的地址 族确定。addrlen参数也是一个返回参数,在调用时初始化为addr所指的地址空间;在调用结束时它包含了实际返回的地址的长度(用字节数表示)。该 函数与SOCK

listen( ) accept( )

吃可爱长大的小学妹 提交于 2020-03-06 04:32:09
服务器端,创建socket,bind绑定套接字后,还需要使用listen()函数让套接字进入被动监听状态,再调用accept()函数,就可以随时响应客户端的请求了 listen() 函数 通过 listen() 函数可以让套接字进入被动监听状态 int listen(int sock, int backlog); //Linux sock 为需要进入监听状态的套接字,backlog 为请求队列的最大长度。 当套接字正在处理客户端请求时,如果有新的请求进来,套接字是没法处理的,只能把它放进缓冲区,待当前请求处理完毕后,再从缓冲区中读取出来处理。如果不断有新的请求进来,它们就按照先后顺序在缓冲区中排队,直到缓冲区满。这个缓冲区,就称为 请求队列(Request Queue) 。 缓冲区的长度(能存放多少个客户端请求)可以通过 listen() 函数的 backlog 参数指定,可以根据你的需求来定, 并发量 小的话可以是10或者20。 如果将 backlog 的值设置为 SOMAXCONN,就由系统来决定请求队列长度,这个值一般比较大,可能是几百,或者更多。当请求队列满时,就不再接收新的请求,对于 Linux,客户端会收到 ECONNREFUSED 错误,对于 Windows,客户端会收到 WSAECONNREFUSED 错误。 注意:listen() 只是让套接字处于监听状态

Linux下IPtables命令详解

谁都会走 提交于 2020-03-03 07:55:24
Linux下IPtables命令图解 Linux下IPtables命令剖析 1.命令: -A 顺序添加,添加一条新规则 -I 插入,插入一条新规则 -I 后面加一数字表示插入到哪行 -R 修改, 删除一条新规则 -D 后面加一数字表示删除哪行 -D 删除,删除一条新规则 -D 后面加一数字表示删除哪行 -N 新建一个链 -X 删除一个自定义链,删除之前要保证次链是空的,而且没有被引用 -L 查看 @1.iptables -L -n 以数字的方式显示 @2. iptables -L -v显示详细信息 @3. iptables -L -x 显示精确信息 -E 重命名链 -F 清空链中的所有规则 -Z 清除链中使用的规则 -P 设置默认规则 2.匹配条件: 隐含匹配: -p tcp udp icmp --sport指定源端口 --dport指定目标端 -s 源地址 -d 目的地址 -i 数据包进入的网卡 -o 数据包出口的网卡 扩展匹配: -m state --state 匹配状态的 -m mutiport --source-port 端口匹配 ,指定一组端口 -m limit --limit 3/minute 每三分种一次 -m limit --limit-burst 5 只匹配5个数据包 -m string --string --algo bm|kmp --string"xxxx"

ServerSocket 与 Socket的区别

▼魔方 西西 提交于 2020-03-03 03:47:14
1.1 ServerSocket类 创建一个ServerSocket类,同时在运行该语句的计算机的指定端口处建立一个监听服务,如: ServerSocket MyListener=new ServerSocket(600); 这里指定提供监听服务的端口是600,一台计算机可以同时提供多个服务,这些不同的服务之间通过端口号来区别,不同的端口号上提供不同的服务。为了随时监听可能的Client请求,执行如下的语句: Socket LinkSocket=MyListener.accept(); 该语句调用了ServerSocket对象的accept()方法,这个方法的执行将使Server端的程序处于等待状态,程序将一直阻塞直到捕捉到一个来自Client端的请求,并返回一个用于与该Client通信的Socket对象Link-Socket。此后Server程序只要向这个Socket对象读写数据,就可以实现向远端的Client读写数据。结束监听时,关闭ServerSocket对象: Mylistener.close(); 1.2 Socket类 当Client程序需要从Server端获取信息及其他服务时,应创建一个Socket对象: Socket MySocket=new Socket(“ServerComputerName”,600); Socket类的构造函数有两个参数

docker容器端口映射解析

微笑、不失礼 提交于 2020-03-02 22:41:48
原文地址: http://xiaorui.cc/?p=1502 问题 docker固定容器ip前提是设置net为none,此情景下所有的网络配置都失效,包括-p端口映射。 目的 使用其他的方法做端口映射,绕过net为none 方法 docker的端口映射并不是在docker技术中实现的,而是通过宿主机的iptables来实现;通过控制网桥来做端口映射,类似路由器中设置路由端口映射。 先检查配置端口映射,iptable设置了什么 执行: docker run -d -p 9000:9000 redis_cluster 9000 root@ubuntu:~# iptables -t nat -L -n Chain PREROUTING (policy ACCEPT) target prot opt source destination DOCKER all -- 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL Chain INPUT (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination DOCKER all -- 0.0.0.0/0 !127.0.0.0/8

ip6tables 基本配置

半世苍凉 提交于 2020-03-01 01:12:25
一、配置效果 [root@gs ~]# ip6tables -nvL Chain INPUT (policy DROP 893 packets, 64296 bytes) pkts bytes target prot opt in out source destination 2630 229K ACCEPT all * * ::/0 ::/0 state RELATED,ESTABLISHED 52 6408 ACCEPT tcp * * ::/0 ::/0 tcp dpt:80 901 107K ACCEPT tcp * * ::/0 ::/0 tcp dpt:443 64 4304 ACCEPT all * * ::/0 fe80::/16 1582 103K ACCEPT all * * fe80::/16 ::/0 Chain FORWARD (policy ACCEPT 543 packets, 224K bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 13718 packets, 1042K bytes) pkts bytes target prot opt in out source destination [root@gs ~]# 二

ip6tables 基本配置

a 夏天 提交于 2020-03-01 00:31:03
一、配置效果 [root@gs ~]# ip6tables -nvL Chain INPUT (policy DROP 893 packets, 64296 bytes) pkts bytes target prot opt in out source destination 2630 229K ACCEPT all * * ::/0 ::/0 state RELATED,ESTABLISHED 52 6408 ACCEPT tcp * * ::/0 ::/0 tcp dpt:80 901 107K ACCEPT tcp * * ::/0 ::/0 tcp dpt:443 64 4304 ACCEPT all * * ::/0 fe80::/16 1582 103K ACCEPT all * * fe80::/16 ::/0 Chain FORWARD (policy ACCEPT 543 packets, 224K bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 13718 packets, 1042K bytes) pkts bytes target prot opt in out source destination [root@gs ~]# 二