网络知识-疑惑自解

TCP/IP相关的网络知识整理。一些疑惑的简单理解。

一些名词的解析

  1. 连接:收包方需要确认收到,就是有连接。TCP就需要ACK确认。
    ACK超时没收到,TCP会重发数据包。
  2. 顺序:收包顺序和发包顺序一致是有序的。TCP这种流式协议是有序的,udp这种数据报是无序的。
  3. 边界:边界用于确认收到一个完整的包。TCP是流协议,需要应用层区分;UDP 的recv返回值>=0,就是单个包的长度了。
    UDP的一种丢包:UDP的recv传入的缓存空间要是小于内核收到的数据报大小,这个数据报将被丢弃。
  4. MTU:最大传输单元,可以理解成IP层最大的分片大小,超出这个大小,就需要分片了。
    这个值一般由链路层限制,以太网:1500,PPPoE:1492,X.25协议:576。UDP常常限制包大小为1400或者512。
    可以用ping命令检测这个值,例如:ping -l 1600 -f www.baidu.com会返回需要分片的信息。

一些疑惑自解

  1. TCP的ACK包的ack一般都是syn+payload,SYN和FIN的ack为什么要+1,他们的payload是0啊?
    答:如果不+1无法确认收到。用FIN就好理解了,如果ack不+1,那么不能区分这个ACK是确认之前的数据全部收到还是确认这个FIN收到了。
  2. UDP的包长度有限制吗?TCP会自己分片数据送给ip层传输,UDP怎么处理,它的包怎么分片的?
    答:UDP报文的长度字段是有两个字节的。UDP直接把包交给ip层,IP层自己根据MTU分配,目标机器的ip层组装。所以最好是限制大小1400,避免被分片。
  3. IP层分片重组怎么判断重组失败,丢弃整个数据报?用定时器吗?
    答:不用定时器?收到分片时,会检查内存消耗,这时清理最旧的分片,相应的数据包也就不能重组成功了。

    一个blog http://blog.chinaunix.net/uid-22577711-id-3219806.html

  4. accept函数返回的socket连接和listen的socket是同一个吗?
    答:不是同一个。accept成功会生成一个新的socket,这个socket连接与listen的socket的ip和端口一样,不一样是这个socket是已连接的,可以获取到客户端的ip和端口。

怎么确定连接断掉了。

TCP要确认,UDP就不用了。

  1. recv返回==0,对端关闭连接。
  2. recv返回<0,检查下errno。如果是errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN,连接还是正常的,其他的连接断掉了。
  3. 使用getsockopt判断连接是否异常。一个简单的判断,只要有错误,就认为连接断掉了。
{
    int type = 0;
    socklen_t typesize = sizeof(type);
    int iCode = getsockopt(socket_id, SOL_SOCKET, SO_ERROR, (char*)&type, &typesize);
    return (iCode == 0);
}

有个特殊情况:TCP连接的一端奔溃后,对端是收不到任何信息的。
这个时候需要心跳包了:

  1. TCP本身提供了keep-alive机制,当TCP连接不使用一段时间后,发keep-alive包检测下。
    补充:keep-alive默认是不开的。一般服务器用,避免半连接占用资源。
  2. 应用层自己收发心跳包,确定连接是否正常。好处:可以同时支持TCP和UDP,可以计算延时啥的。
    补充:应用层缓冲区满了,可以直接认为连接不可用,比较方便,毕竟应用层的缓冲区一般是很大的。

PS:在学习样例里SetKeepAlive的函数,兼容windows、mac、linux

为什么要用TCP_NODELAY,TCP的延时问题是怎么样的

很多文章会说到这个。这里简单描述下。
延迟确认与Nagle算法同时起作用时,会造成延时增加。描述起来是这样一个情况:

  1. 客户端发送第一个小数据包
  2. 服务器收到,触发延迟确认
  3. 客户端发送第二个小数据包,但是第一个包还没收到ACK,触发Nagle算法,延迟发送。

问题就来了,第二个小数据包要等待服务器超时确认后才发送。
有选项解决这个问题:

  1. TCP_NODELAY:关闭Nagle算法,小包立即发送
  2. TCP_QUICKACK:关闭延迟确认,只生效一次,需要每次recv后重新设置

PS:还有个问题会增加延时,TCP有超时重传的机制,丢包后延时不可避免要增加。这个超时时间由系统决定。
所以对时效性要求高的应用(如:实时对战游戏)会选择UDP,浪费带宽,快速重传。

PS:在学习样例里SetNoBlock的函数,兼容windows、mac、linux

组播是个什么东西。单播和广播比较好理解,组播不清楚具体怎么工作的。

ipv4和ipv6里都有专门的组播地址,标识的是一个组而不是单独终端。
一般编程用不到,大概是路由器层面才用到。
组播地址列表。

  • ipv4: 224.0.0.0 ~ 239.255.255.255,也就是1110开头的所有ip
  • ipv6: FF00::/8

ipv6没有广播地址255.255.255.255,但是有特殊的多播地址FF02::1,同样的作用。

奇怪的问题

  1. UDP的bind出错,错误码10022,错误消息“提供了一个无效的参数”。
    windows上,udp的socket先connect,再bind出这个错误。bind需要在connect之前调用

  2. 开发测试时,把本机同时当成客户端和服务器端,wireshark不能抓取数据包。设置路由解决。
    例如本地ip是192.168.2.186,网关是192.168.0.1。
    添加路由:route add 192.168.2.186 mask 255.255.255.255 192.168.0.1 metric 1
    删除路由:route delete 192.168.2.186 mask 255.255.255.255 192.168.0.1 metric 1

    参考blog http://www.cnblogs.com/luhouxiang/p/3606976.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,125评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,293评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,054评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,077评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,096评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,062评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,988评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,817评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,266评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,486评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,646评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,375评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,974评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,621评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,642评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,538评论 2 352

推荐阅读更多精彩内容

  • 个人认为,Goodboy1881先生的TCP /IP 协议详解学习博客系列博客是一部非常精彩的学习笔记,这虽然只是...
    贰零壹柒_fc10阅读 5,053评论 0 8
  • 1.这篇文章不是本人原创的,只是个人为了对这部分知识做一个整理和系统的输出而编辑成的,在此郑重地向本文所引用文章的...
    SOMCENT阅读 13,062评论 6 174
  • 同样的,本文篇幅也比较长,先来一张思维导图,带大家过一遍。 一、 计算机网络体系结构分层 二、 TCP/IP 基础...
    涤生_Woo阅读 65,027评论 38 1,038
  • 简介 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者...
    保川阅读 5,955评论 1 13
  • 1. 基础知识 1.1 3种常见的计算机体系结构划分 OSI分层(7层):物理层、数据链路层、网络层、传输层、会话...
    Mr希灵阅读 19,873评论 6 120