为什么TCP socket 超时时间实际使用时,对较大的数据

WebSocket 和 Socket 的区别 - 文章 - 伯乐在线
& WebSocket 和 Socket 的区别
当我们探讨两件事物的区别和联系时,我们想探讨些什么?
前段时间写了两篇介绍 HTTP 和 WebSocket 的文章,回复中有人说希望了解下WebSocket和Socket的区别。这个问题之前也有想过,自己对此是有大概的答案,可是并不太确定,于是去搜集了些资料(其实就是各种Google),看了很多以前的文档,觉得有些故事十分有趣,整理如下,算是一个外传。
文中图片全来自Google图片搜索,如侵删。
就像Java和JavaScript,并没有什么太大的关系,但又不能说完全没关系。可以这么说:
命名方面,Socket是一个深入人心的概念,WebSocket借用了这一概念;
使用方面,完全两个东西。
Java和JavaScript的关系
当我们探讨两件事物的区别和联系时,我们想探讨些什么?
对于我来说,大多数情况是想知道两件事物本身,而并不是想只想了解「区别」本身。那么对这个问题最直接的解决方法应该是去了解Socket和WebSocket的来源和用法,那么它们的区别和联系就不言自明了。
Socket可以有很多意思,和IT较相关的本意大致是指在端到端的一个连接中,这两个端叫做Socket。对于IT从业者来说,它往往指的是TCP/IP网络环境中的两个连接端,大多数的API提供者(如操作系统,JDK)往往会提供基于这种概念的接口,所以对于开发者来说也往往是在说一种编程概念。同时,操作系统中进程间通信也有Socket的概念,但这个Socket就不是基于网络传输层的协议了。
Unix 中的 Socket
操作系统中也有使用到Socket这个概念用来进行进程间通信,它和通常说的基于TCP/IP的Socket概念十分相似,代表了在操作系统中传输数据的两方,只是它不再基于网络协议,而是操作系统本身的文件系统。
网络中的 Socket
通常所说的Socket API,是指操作系统中(也可能不是操作系统)提供的对于传输层(TCP/UDP)抽象的接口。现行的Socket API大致都是遵循了BSD Socket规范(包括Windows)。这里称规范其实不太准确,规范其实是POSIX,但BSD Unix中对于Socket的实现被广为使用,所以成为了实际的规范。如果你要使用HTTP来构建服务,那么就不需要关心Socket,如果你想基于TCP/IP来构建服务,那么Socket可能就是你会接触到的API。
在TCP/IP网络中HTTP的位置
从上图中可以看到,HTTP是基于传输层的TCP协议的,而Socket API也是,所以只是从使用上说,可以认为Socket和HTTP类似(但一个是成文的互联网协议,一个是一直沿用的一种编程概念),是对于传输层协议的另一种直接使用,因为按照设计,网络对用户的接口都应该在应用层。
Socket 名称的由来
和很多其他Internet上的事物一样,Socket这个名称来自于大名鼎鼎的ARPANET(Advanced Research Projects Agency),早期ARPANET中的Socket指的是一个源或者目的地址——大致就是今天我们所说的IP地址和端口号。最早的时候一个Socket指的是一个40位的数字(RFC33中说明了此用法,但在RFC36中并没有明确地说使用40位数字来标识一个地址),其中前32为指向的地址(socket number,大致相当于IP),后8位为发送数据的源(link,大致相当于端口号)。对他们的叫法有很多的版本,这里列举的并不严谨。
端口号的野史
随着ARPANET的发展,后来(RFC433,Socket Number List)socket number被明确地定义为一个40位的数字,其中后8位被用来制定某个特定的应用使用(比如1是Telnet)。这8位数有很多名字:link、socket name、AEN(another eight number,看到这个名字我也是醉了),工程师逗逼起来也是挺拼的。
后来在Internet的规范制定中,才真正的用起了port number这个词。至于为什么端口号是16位的,我想可能有两个原因,一是对于当时的工程师来说,如果每个端口号来标识一个程序,65535个端口号也差不多够用了。二可能是为了对齐吧,^_^!!。
Socket 原本的意思
在上边提到的历史中使用到的Socket,包括TCP文档中使用到的Socket,其实指的是网络传输中的一端,是一个虚拟化的概念。
上边简单叙述了Socket的意义,由于年代久远,很多事情也搞不了那么清楚。但WebSocket是一个很晚近的东西,可以让我们看到它是如何成为现在我们看到的这个样子的。
WHATWG(Web Hypertext Application Technology Working Group)
关于HTML5的故事很多人都是知道的,w3c放弃了HTML,然后有一群人(也有说是这些人供职的公司,不过官方的文档上是说的个人)创立了组织来推动HTML语言的继续发展,同时,他们还发展了很多关于Web的技术标准,这些标准不断地被官方所接受。WebSocket就属于WHATWG发布的Web Application的一部分(即HTML5)的产物。
为什么会有 WebSocket
大约在08年的时候,WG的工程师在讨论网络环境中需要一种全双工的连接形式,刚开始一直叫做「TCPConnection」,并讨论了这种协议需要支持的功能,大致已经和我们今天看到的WebSocket差不多了。他们认为基于现有的HTTP之上的一些技术(如长轮询、Comet)并满足不了这种需求,有必要定义一个全新的协议。
名称的由来
在很多的关于HTML5或者WebSocket的文档中,都能看到一个名字,Hixie(Ian Hickson),他是WHATWG组织的发言人,曾供职于Netscape、Opera、Google,看工作的公司就知道这个人的背景了。
08年6月18日,一群WHATWG的工程师在讨论一些技术问题,一个工程师提到说「我们之前讨论的那个东西,不要叫TCPConnection 了,还是起个别的名字吧 」,接着几个名字被提及,DuplexConnection,TCPSocket,SocketConnection ,一个叫mcarter(Michael Carter )的工程师说他马上要写一篇关于Comet的文章,如果可以确定这个名称,想在文章中引用这个名字。
Socket一直以来都被人用来表示网络中一个连接的两端,考虑到怎么让工程师更容易接受,后来Hixie说了一句「我看WebSocket这个名字就很适合嘛(Hixie briefly pops back online to record that “WebSocket” would probably be a good new name for the TCPConnection object)」,大家都没有异议,紧接着mcarter在Comet Daily中发表了文章,后来随着各大浏览器对WebSocket的支持,它变成了实际的标准,IETF也沿用了这个名字。
下边是在WHATWG文档中对WebSocket接口的定义
enum BinaryType { "blob", "arraybuffer" };
[Constructor(USVString url, optional (DOMString or sequence&DOMString&) protocols = []), Exposed=(Window,Worker)]
interface WebSocket : EventTarget {
readonly attribute USVS
// ready state
const unsigned short CONNECTING = 0;
const unsigned short OPEN = 1;
const unsigned short CLOSING = 2;
const unsigned short CLOSED = 3;
readonly attribute unsigned short readyS
readonly attribute unsigned long long bufferedA
// networking
attribute EventH
attribute EventH
attribute EventH
readonly attribute DOMS
readonly attribute DOMS
void close([Clamp] optional unsigned short code, optional USVString reason);
// messaging
attribute EventH
attribute BinaryType binaryT
void send(USVString data);
void send(Blob data);
void send(ArrayBuffer data);
void send(ArrayBufferView data);
<div class="crayon-num" data-line="crayon-5a24ac<div class="crayon-num crayon-striped-num" data-line="crayon-5a24ac<div class="crayon-num" data-line="crayon-5a24ac<div class="crayon-num crayon-striped-num" data-line="crayon-5a24ac<div class="crayon-num" data-line="crayon-5a24ac<div class="crayon-num crayon-striped-num" data-line="crayon-5a24ac<div class="crayon-num" data-line="crayon-5a24ac<div class="crayon-num crayon-striped-num" data-line="crayon-5a24ac<div class="crayon-num" data-line="crayon-5a24ac<div class="crayon-num crayon-striped-num" data-line="crayon-5a24ac<div class="crayon-num" data-line="crayon-5a24ac<div class="crayon-num crayon-striped-num" data-line="crayon-5a24ac<div class="crayon-num" data-line="crayon-5a24ac<div class="crayon-num crayon-striped-num" data-line="crayon-5a24ac<div class="crayon-num" data-line="crayon-5a24ac<div class="crayon-num crayon-striped-num" data-line="crayon-5a24ac<div class="crayon-num" data-line="crayon-5a24ac<div class="crayon-num crayon-striped-num" data-line="crayon-5a24ac<div class="crayon-num" data-line="crayon-5a24ac<div class="crayon-num crayon-striped-num" data-line="crayon-5a24ac<div class="crayon-num" data-line="crayon-5a24ac<div class="crayon-num crayon-striped-num" data-line="crayon-5a24ac<div class="crayon-num" data-line="crayon-5a24ac<div class="crayon-num crayon-striped-num" data-line="crayon-5a24ac<div class="crayon-num" data-line="crayon-5a24ac<div class="crayon-num crayon-striped-num" data-line="crayon-5a24ac<div class="crayon-num" data-line="crayon-5a24ac<div class="crayon-num crayon-striped-num" data-line="crayon-5a24ac<div class="crayon-num" data-line="crayon-5a24ac
enum BinaryType { "blob", "arraybuffer" };[Constructor(USVString url, optional (DOMString or sequence&DOMString&) protocols = []), Exposed=(Window,Worker)]interface WebSocket : EventTarget {&&readonly attribute USVString url;&&&// ready state&&const unsigned short CONNECTING = 0;&&const unsigned short OPEN = 1;&&const unsigned short CLOSING = 2;&&const unsigned short CLOSED = 3;&&readonly attribute unsigned short readyState;&&readonly attribute unsigned long long bufferedAmount;&&&// networking&&attribute EventHandler onopen;&&attribute EventHandler onerror;&&attribute EventHandler onclose;&&readonly attribute DOMString extensions;&&readonly attribute DOMString protocol;&&void close([Clamp] optional unsigned short code, optional USVString reason);&&&// messaging&&attribute EventHandler onmessage;&&attribute BinaryType binaryType;&&void send(USVString data);&&void send(Blob data);&&void send(ArrayBuffer data);&&void send(ArrayBufferView data);};
内容的确定
大多数新技术的出现都是建立在已有技术的铺垫之上的,WebSocket内容的确定也是如此,其中就有Comet看不到的贡献,Comet是一个很有趣的技术,有兴趣可以
可以把WebSocket想象成HTTP,HTTP和Socket什么关系,WebSocket和Socket就是什么关系。
可能感兴趣的话题
不错,学习了
关于伯乐在线博客
在这个信息爆炸的时代,人们已然被大量、快速并且简短的信息所包围。然而,我们相信:过多“快餐”式的阅读只会令人“虚胖”,缺乏实质的内涵。伯乐在线内容团队正试图以我们微薄的力量,把优秀的原创文章和译文分享给读者,为“快餐”添加一些“营养”元素。
新浪微博:
推荐微信号
(加好友请注明来意)
&#8211; 好的话题、有启发的回复、值得信赖的圈子
&#8211; 分享和发现有价值的内容与观点
&#8211; 为IT单身男女服务的征婚传播平台
&#8211; 优秀的工具资源导航
&#8211; 翻译传播优秀的外文文章
&#8211; 国内外的精选文章
&#8211; UI,网页,交互和用户体验
&#8211; 专注iOS技术分享
&#8211; 专注Android技术分享
&#8211; JavaScript, HTML5, CSS
&#8211; 专注Java技术分享
&#8211; 专注Python技术分享
& 2017 伯乐在线用C语言进行最基本的socket编程
作者:jack_Meng
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了C语言下socket编程的基本知识讲解,包括最基本的客户端发送及服务器端接受数据的实现,需要的朋友可以参考下
什么是socket
  你经常听到人们谈论着 “socket”,或许你还不知道它的确切含义。现在让我告诉你:它是使用 标准Unix 文件描述符 (file descriptor) 和其它程序通讯的方式。什么?你也许听到一些Unix高手(hacker)这样说过:“呀,Unix中的一切就是文件!”那个家伙也许正在说到一个事实:Unix 程序在执行任何形式的 I/O 的时候,程序是在读或者写一个文件描述符。一个文件描述符只是一个和打开的文件相关联的整数。但是(注意后面的话),这个文件可能是一个网络连接,FIFO,管道,终端,磁盘上的文件或者什么其它的东西。Unix 中所有的东西就是文件!所以,你想和Internet上别的程序通讯的时候,你将要使用到文件描述符。你必须理解刚才的话。现在你脑海中或许冒出这样的念头:“那么我从哪里得到网络通讯的文件描述符呢?”,这个问题无论如何我都要回答:你利用系统调用 socket(),它返回套接字描述符 (socket descriptor),然后你再通过它来进行send() 和 recv()调用。“但是...”,你可能有很大的疑惑,“如果它是个文件描述符,那么为什 么不用一般调用read()和write()来进行套接字通讯?”简单的答案是:“你可以使用!”。详细的答案是:“你可以,但是使用send()和recv()让你更好的控制数据传输。”存在这样一个情况:在我们的世界上,有很多种套接字。有DARPA Internet 地址 (Internet 套接字),本地节点的路径名 (Unix套接字),CCITT X.25地址 (你可以将X.25 套接字完全忽略)。也许在你的Unix 机器上还有其它的。我们在这里只讲第一种:Internet 套接字。
Internet 套接字的两种类型 :
  什么意思?有两种类型的Internet 套接字?是的。不,我在撒谎。其实还有很多,但是我可不想吓着你。我们这里只讲两种。除了这些, 我打算另外介绍的 "Raw Sockets" 也是非常强大的,很值得查阅。
那么这两种类型是什么呢?一种是"Stream Sockets"(流格式),另外一种是"Datagram Sockets"(数据包格式)。我们以后谈到它们的时候也会用到"SOCK_STREAM" 和 "SOCK_DGRAM"。数据报套接字有时也叫“无连接套接字”(如果你确实要连接的时候可以用connect()。) 流式套接字是可靠的双向通讯的数据流。如果你向套接字按顺序输出“1,2”,那么它们将按顺序“1,2”到达另一边。它们是无错误的传递的,有自己的错误控制,在此不讨论。
&&& 有什么在使用流式套接字?你可能听说过 telnet,不是吗?它就使用流式套接字。你需要你所输入的字符按顺序到达,不是吗?同样,WWW浏览器使用的 HTTP 协议也使用它们来下载页面。实际上,当你通过端口80 telnet 到一个 WWW 站点,然后输入 “GET pagename” 的时候,你也可以得到 HTML 的内容。为什么流式套接字可以达到高质量的数据传输?这是因为它使用了“传输控制协议 (The Transmission Control Protocol)”,也叫 “TCP” (请参考 RFC-793 获得详细资料。)TCP 控制你的数据按顺序到达并且没有错
误。你也许听到 “TCP” 是因为听到过 “TCP/IP”。这里的 IP 是指“Internet 协议”(请参考 RFC-791。) IP 只是处理Internet 路由而已。
&&& 那么数据报套接字呢?为什么它叫无连接呢?为什么它是不可靠的呢?有这样的一些事实:如果你发送一个数据报,它可能会到达,它可能次序颠倒了。如果它到达,那么在这个包的内部是无错误的。数据报也使用 IP 作路由,但是它不使用 TCP。它使用“用户数据报协议 (User Datagram Protocol)”,也叫 “UDP” (请参考 RFC-768。)
&&& 为什么它们是无连接的呢?主要是因为它并不象流式套接字那样维持一个连接。你只要建立一个包,构造一个有目标信息的IP 头,然后发出去。无需连接。它们通常使用于传输包-包信息。简单的应用程序有:tftp, bootp等等。
&&& 你也许会想:“假如数据丢失了这些程序如何正常工作?”我的朋友,每个程序在 UDP 上有自己的协议。例如,tftp 协议每发出的一个被接受到包,收到者必须发回一个包来说“我收到了!” (一个“命令正确应答”也叫“ACK” 包)。如果在一定时间内(例如5秒),发送方没有收到应答,它将重新发送,直到得到 ACK。这一ACK过程在实现SOCK_DGRAM 应用程序的时候非常重要。
简单的发送和接收实现
服务器端接收代码:
#include &Winsock2.h&
#pragma comment(lib,"Ws2_32.lib")
#include &stdio.h&
#include &memory.h&
void main()
WSAStartup(MAKEWORD(2,0),&wsd);
SOCKET s =NULL;
s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
struct sockaddr_
memset(&ch,0,sizeof(ch));
ch.sin_family=AF_INET;
ch.sin_addr.s_addr=INADDR_ANY;
ch.sin_port=htons(1041);
int b=bind(s,(struct sockaddr *) &ch,sizeof(ch));
#define QUEUE_SIZE 5
int l=listen(s,QUEUE_SIZE);
printf("正在监听本机的1041端口!\n");
SOCKET sc=accept(s,0,0);
printf("客户端已经连接到本机的1041端口!\n");
#define BUF_SIZE 4096
int receByt=0;
char buf[BUF_SIZE];
receByt=recv(sc,buf,BUF_SIZE,0);
buf[receByt]='\0';
if(receByt&0)
printf("接收的消息是:%s\n",buf);
printf("接收消息结束!");
int ic=closesocket(sc);
int is=closesocket(s);
客户端发送的代码:
#include &Winsock2.h&
#pragma comment(lib,"Ws2_32.lib")
#include &stdio.h&
#include &memory.h&
#include &string.h&
void main()
WSAStartup(MAKEWORD(2,0),&wsd);
SOCKET s =NULL;
s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
struct sockaddr_
memset(&ch,0,sizeof(ch));
ch.sin_family=AF_INET;
ch.sin_addr.s_addr=inet_addr("127.0.0.1");
ch.sin_port=htons(1041);
int c=connect(s,(struct sockaddr *) &ch,sizeof(ch));
printf("已经连接到服务器的1041端口!现在可以向服务器发送消息了!\n");
#define BUF_SIZE 4096
char info[1024],buf[BUF_SIZE];
gets(info);
if(info[0]=='\0')
strcpy(buf,info);
int nsend=send(s,buf,strlen(buf),0);
int ic=closesocket(s);
程序代码经过了优化,并且整合多线程,把接收和发送放到同一个文件中,使用参数模式调用发送和接收模块。增加了创建SOCKET的创建的时候s句柄(或对象)判断返回值是否为INVALID_SOCKET,以及socket的bind操作的返回值是否为SOCKET_ERROR,其他socket的操作应该也判断SOCKET_ERROR,以保证程序的稳定性,这里只是测试代码就不去写这么多了,剩下的就由你个人发挥。
#include &Winsock2.h&
#pragma comment(lib,"Ws2_32.lib")
#include &stdio.h&
#include &memory.h&
#include &string.h&
#include &pthread.h&
void Receive();
void Send();
void creatThread();
SOCKET s =NULL;
pthread_t t[1000];
int threadCount=0;
void main(int argc,char* argv[])
printf("本程序制作人学号:\n");
printf("程序说明:服务器端和客户端为同一个程序,请使用不同的参数运行.\n");
printf("接收程序请使用 r参数;发送程序请使用 s参数。\n");
//printf("len : %d\n", argc);
//printf("count %d\n",argc);
//printf("value: %s\n",argv[1]);
//printf("%d",argv[1][0]=='r');
if(argc&=1)
printf("please input program arguments ...\n");
if(argc&1 && argv[1][0]=='r')
printf("run receive ...\n");
Receive();
if(argc&1 && argv[1][0]=='s')
printf("run send ...\n");
void* receiveWork(void * args)
SOCKET sc=accept(s,0,0);
if(sc==INVALID_SOCKET)
printf("sc Error");
creatThread();
printf("----------客户端已经连接到本机的%d线程连接!\n",threadCount-2);
#define BUF_SIZE 4096
int receByt=0;
char buf[BUF_SIZE];
receByt=recv(sc,buf,BUF_SIZE,0);
buf[receByt]='\0';
if(receByt&0)
printf("线程接收的消息是:%s\n",buf);
printf("客户端已退出,");
int ic=closesocket(sc);
printf("服务器结束连接!\n");
return NULL;
void creatThread()
pthread_create(&t[threadCount++],NULL,receiveWork,NULL);
void Receive()
WSAStartup(MAKEWORD(2,0),&wsd);
s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(s==INVALID_SOCKET)
printf("socket created Error");
struct sockaddr_
memset(&ch,0,sizeof(ch));
ch.sin_family=AF_INET;
ch.sin_addr.s_addr=INADDR_ANY;
ch.sin_port=htons(1041);
int b=bind(s,(struct sockaddr *) &ch,sizeof(ch));
if(b==SOCKET_ERROR)
printf("bind 失败,出错代码是:%d\n",WSAGetLastError());
#define QUEUE_SIZE 5
int l=listen(s,QUEUE_SIZE);
printf("正在监听本机的1041端口!\n");
creatThread();
for(int i=0;i&1000;i++)
pthread_join(t[i],NULL);
int is=closesocket(s);
void Send()
WSAStartup(MAKEWORD(2,0),&wsd);
SOCKET s =NULL;
s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(s==INVALID_SOCKET)
printf("socket created Error");
struct sockaddr_
memset(&ch,0,sizeof(ch));
ch.sin_family=AF_INET;
ch.sin_addr.s_addr=inet_addr("127.0.0.1");
ch.sin_port=htons(1041);
int c=connect(s,(struct sockaddr *) &ch,sizeof(ch));
printf("已经连接到服务器的1041端口!现在可以向服务器发送消息了!\n");
#define BUF_SIZE 4096
char info[1024],buf[BUF_SIZE];
gets(info);
if(info[0]=='\0')
strcpy(buf,info);
int nsend=send(s,buf,strlen(buf),0);
int ic=closesocket(s);
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具相关文章推荐:
windows 最大tcp连接数
tcp最大连接数只有28222个的解决方案
问题背景:
用Tsung模拟压力测试时,将ulimit -n的值调为65535,想建立6万多个tcp连接,但最终只观察到28222个。
原因分析:
这是因为Linux默认的端口范围不是0~65535,而是。可用以下命令验证
[root@tixa ~]# sysctl -a | grep ip_local_port_range
net.ipv4.ip_local_port_range = 32768
=28232个。其他...
阅读(30) 回复(0)
其他文章推荐
本文转自.cn/s/blog_6f5bc.html1、修改用户进程可打开文件数限制
在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发tcp连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个tcp连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄)。可使用ulimit命令查看系统允许当前用户进程打开的文件数限制:
[speng@as4 ~...
阅读(0) 回复(0)
windows 2008远程桌面连接数限制
安装了windows server 2008 Enterprise R2,现在要远程连接,开启了服务器上的远程桌面连接,使用管理员远程登录。默认情况下windows server 2008 Enterprise只允许一个连接。默认一个账号最大2个连接。
因需要两台电脑连接。在windows server 2008 调整下默认配置。
开启远程桌面连接:
【计算机】-&【属性】-&【远程设置】-&勾选【允许运行任意版本远程桌面的计算机连接(较不...
阅读(570) 回复(0)
paf.net/Class/tcpANDIP/8.html
[背景知识]
MTU: Maxitum Transmission Unit 最大传输单元
MSS: Maxitum Segment Size 最大分段大小(偶是直译,翻译的不好,不要打
PPPoE: PPP Over Ethernet(在以太网上承载PPP协议)
[分析过程]
先说说这MTU最大传输单元,这个最大传输单元实际上和链路层协议有着密切的关系,让我们先仔细回忆一下EthernetII帧的结构DMAC+SMAC+Type+...
阅读(30) 回复(0)
导读: 微软已经超过惠普成为全球最大的windows 8和windows RT设备厂商。AdDuplex的数据来自windows Store中近800款应用的使用状况,Surface平板是访问windows Store最多的设备。
微软公司一直是世界电脑行业的霸主,现在微软又有新动作,微软已经超过惠普成为全球最大的windows 8和windows RT设备厂商。AdDuplex的数据来自windows Store中近800款应用的使用状况,Surface平板是访问windows Store最多的设备,数据显示会...
网络与安全
阅读(0) 回复(0)
#!/bin/bash
[ $# -lt 3 ] && {
test -p npc2s || mkfifo npc2s || { }
test -p nps2c || mkfifo nps2c || { }
nc -lk $LPORT &npc2s &nps2c &
[ $? -ne 0 ] && { echo...
网络与安全
阅读(0) 回复(0)
通常会采用修改注册表的方式改进windows的系统参数。下面将为大家介绍windows系统下的tcp参数优化方式,适用于windows 2003、windows XP、windows 7以及Server版。对于具体的系统环境与性能需求,优化方式会有所差异,效果也不尽相同,仅是个人的建议。所有的优化操作都通过修改注册表实现,需要使用regedit命令进入注册表并创建或修改参数,修改完成后需要重启系统,以使之生效。以下使用的参数值均为10进制。
1. tcpwindowsize...
网络与安全
阅读(90) 回复(0)
tcp本身的可靠性是利用确认机制,超时重发来保证的,这些不说了,网上资料很多。不过以前一直没有仔细学习过tcp的网络拥塞控制,现在记录下一些总结吧。什么是拥塞?
一图胜千言,看上面的图,上面是负载-吞吐量,下面是负载-延迟,问题很明显了,受限于网络节点的物理承受能力,负载显然不可能和吞吐量成线性关系,当负载在Knee点的时候,吞吐量在一个较高的水平,同时数据包的延迟也较小,网络处于一个较好的状态,Knee点到Cli...
阅读(0) 回复(0)
tcp/IP 4层网络 tcp的3次握手 tcp的4次挥手tcp的SEQ和ACK
在tcp通讯中,无论是建立连接,数据传输,友好断开,强制断开,都离不开Seq值和Ack值,它们是tcp传输的可靠保证.Seq是发送方告诉接收方,我当前已经发送了Seq个字节(不包括Eth头,IP头和tcp头,也就是纯数据长度)给你,例如在建立连接双方握手时,发送方的Seq为0,发送的数据长度也为0,这时接收方收到数据帧后,会判断Seq+数据长度为0或者Seq+数据长度为1的话,那么在回应发送方的...
阅读(0) 回复(0)
tcp/IP 4层网络 tcp的3次握手 tcp的4次挥手tcp的SEQ和ACK
在tcp通讯中,无论是建立连接,数据传输,友好断开,强制断开,都离不开Seq值和Ack值,它们是tcp传输的可靠保证.Seq是发送方告诉接收方,我当前已经发送了Seq个字节(不包括Eth头,IP头和tcp头,也就是纯数据长度)给你,例如在建立连接双方握手时,发送方的Seq为0,发送的数据长度也为0,这时接收方收到数据帧后,会判断Seq+数据长度为0或者Seq+数据长度为1的话,那么在回应发送方的...
阅读(0) 回复(0)
一个tcp包的结构是(RFC 793):
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Source Port
Destination Port
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
阅读(30) 回复(0)
盛拓传媒:
北京皓辰网域网络信息技术有限公司. 版权所有
北京市公安局海淀分局网监中心备案编号:
广播电视节目制作经营许可证:编号(京)字第1149号
ITPUB推荐文章解答你所有技术难题}

我要回帖

更多关于 socket 设置超时时间 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信