概念

TCP连接的关闭

TCP连接的关闭

多线程多进程关闭连接的区别

  首先来看看close和shutdown两个系统调用对应的内核函数:

TCP连接的关闭

 

TCP连接的关闭

  上图是调用close和shutdown关闭连接时的函数调用过程,sys_close和sys_shutdown这两个系统调用最终是由tcp_close和tcp_shutdown方法来实现的。

  由此我们可以来看一个问题:当socket被多进程或者多线程共享时,关闭连接时有何区别? 
  从图中可以看到sys_close封装调用过程中有一个fput函数,它有一个引用计数,记录这个socket被引用了多少次。当这个引用计数不为0时,是不会触发真正关闭tcp连接的tcp_close方法的。

  引用计数是怎么来的呢?创建进程和线程都是由clone系统调用实现的,只不过clone的参数不同,行为也不同。

  在clone系统调用中,会调用方法copy_files来拷贝文件描述符(包括socket)。创建线程时,传入的flag参数中包含标志位CLONE_FILES,此时,线程将会共享父进程中的文件描述符。

  而创建进程时没有这个标志位,这时,会把进程打开的所有文件描述符的引用计数加1。所以子进程会将父进程中已经建立的socket加上引用计数,当进程中close一个socket时,只会减少引用计数,仅当引用计数为0时才会触发tcp_close。

  单线程(进程)中使用close与多线程中是一致的,但这两者与多进程的行为并不一致,多进程中共享的同一个socket必须都调用了close才会真正的关闭连接。

  shutdown是没有引用计数什么事的,只要调用了就会去试图按需关闭连接。所以shutdown与多线程、多进程无关。

close发生了什么

  TCP连接是全双工的连接,及连接双方可以并行的发送或者接收消息。这样关闭连接时就存在3种情形:完全关闭连接; 关闭发送消息的功能;关闭接收消息的功能。其中,后者就叫做半关闭,由shutdown实现,前者用close实现。

  我们现在来看看close。

 

TCP连接的关闭

我们依次来看一下这三种情形:

1)关闭监听句柄

  用于listen的监听句柄是close关闭的,它本身并不对应着某个连接,但是附着在它之上的却可能有半成品连接,即1、2次握手完成,第3次未完成,就会在服务器上有许多半连接,close的工作主要是清理这些半连接。

  keepalive定时器是干嘛的?keepalive是TCP中一个可以检测死连接的机制,侧重在保持客户端和服务端的连接,防止僵死、异常退出的客户端占用服务器连接资源。

  比如A与B建立连接后,突然B宕机了,之后时间内B再也没有起来,如果B宕机后A和B一直没有数据通信的需求,A就永远不会发现B已经挂了,那么A的内核里还维护着一份关于A与B之间TCP连接的信息,浪费系统资源。

  所以TCP层面引入了keepalive机制,A会定期给B发送空的数据包,通俗讲就是心跳包。

  内核对于tcp keepalive的调整主要有以下三个参数:

TCP连接的关闭

  当tcp发现未收到对端数据时,开始以间隔tcp_keepalive_intvl(75)秒的频率发送心跳包。

  如果连续tcp_keepalive_probes(9)次以上未响应代表对端已经down了,close该连接。

  参照上图,close首先会移除keepalive定时器,移除此定时器后,若ESTABLISH状态的TCP连接在tcp_keepalive_time时间(如服务器上常配置为2小时)内没有通讯,服务器就会主动关闭连接。接下来,发送RST包去关闭每一个半连接,处理完所有半打开的连接close的任务就基本完成了。

2)关闭普通ESTABLISH状态的连接(未设置so_linger,默认)

  首先检查是否有接收到却未处理的消息。如果有,根据close的行为是要丢掉这些消息的。

  但丢弃消息后,意味着远端误以为发出的消息已经被本机处理了(因为ACK包确认过了),但实际上是收到未处理,此时不能使用正常的四次握手关闭连接,而是会向远端发送一个RST非正常复位关闭连接。所以这要求程序员在关闭连接前,确保接收并处理了连接上的消息。

  如果此时没有未处理的消息,那么发送FIN来关闭连接。这时,再看看是否有待发送消息,如果有,那么会在最后一个报文中加入FIN标志,同时关闭angle算法,一次性将所有包发出;如果没有未发送消息,则仅发送一个FIN报文,发送出去关闭连接。

3)使用了so_linger的连接

  so_linger是干嘛的?so_linger决定系统如何处理残留在套接字发送队列中的数据。我们可能有强可靠性的需求,也就是说,必须确保发出的消息、FIN都被对方收到。

  怎么做到呢?就是等待,close会阻塞住进程,直到对方确认收到了再返回,但是如果对方总是不响应怎么办呢?所以还需要l_linger这个超时时间,控制close阻塞进程的最长时间。

TCP连接的关闭

  上图是l_linger参数的设置及其对应的行为,默认情况下是第一种情况。

  当使用了so_linger后,前半段仍然没有变化。首先检查是否有未处理消息,有则发RST关连接。

  接下来检查是否有未发送消息,这种与第二种情况一致,设好FIN后关闭angle算法。接下来,会设置最大等待时间l_linger,然后进程开始睡眠,直到确认对方接收到消息,将控制权交还给用户进程。

  总结一下就是:调用close时,可能导致发送RST复位关闭连接,例如有未读消息、打开so_linger但l_linger却为0、关闭监听句柄时半打开的连接。更多时会导致发FIN来四次握手关闭连接,但打开so_linger可能导致close阻塞等待着对方的ACK表明收到了消息。

本文转自:小组15级成员--杜肖孟

原文地址:http://blog.csdn.net/tanswer_/article/details/78422879

TCP/IP指南

组织:中国互动出版网(http://www.china-pub.com/)
RFC文档中文翻译计划(http://www.china-pub.com/compters/emook/aboutemook.htm)
E-mail:ouyang@china-pub.com
译者:(   )
译文发布时间:2001-12-28
版权:本中文翻译文档版权归中国互动出版网所有。可以用于非商业用途自由转载,但必须保留
本文档的翻译及版权信息。




Network Working Group                                      T. Socolofsky
Request for Comments:  1180                                      C. Kale
                                                  Spider Systems Limited
                                                            January 1991

  
  

TCP/IP指南
(RFC1180——A TCP/IP Tutorial)
  
本备忘录的状态
  
这本 RFC 是 TCP/IP 协议的指南, 重点介绍通过一个路由 
器从来源主机提交一个 IP 数据包到目的地主机的步骤。 
它不指定一个因特网标准。 
  
目录
  
    

paddlepaddle的个性化推荐教程

个性化推荐

本教程源代码目录在book/recommender_system, 初次使用请参考PaddlePaddle安装教程,更多内容请参考本教程的视频课堂

背景介绍

在网络技术不断发展和电子商务规模不断扩大的背景下,商品数量和种类快速增长,用户需要花费大量时间才能找到自己想买的商品,这就是信息超载问题。为了解决这个难题,推荐系统(Recommender System)应运而生。…

如何为技术博客设计一个推荐系统(中):基于 Google 搜索的半自动推荐

与统计学相比,基于内容来向用户推荐相似的内容,往往更容易获得。对于推荐来说,则有两种方式:

  • 手动推荐
  • 自动推荐

手动推荐。在技术领域,作者通常比大多数读者更专业,他们往往知道什么是读者需要的。如,你看了一个 React 相关的文章,你可能会需要 Redux 相关的内容。

自动推荐。需要一些前提条件:融合现有系统的数据信息,获取一些用户的信息。随后,再计算出相关的内容,最后返回给读者。

而在这篇文章里,我们将介绍 :

  1. 标签生成的方式
  2. 基于手动标签推荐
  3. 半自动的标签推荐
  4. 全自动的基于内容推荐

标签生成

文章与我们平时使用的物品,有很大的不同之处。如手机,拥有固定的规格参数,价格、屏幕尺寸、运行内存(RAM)、机身内存、CPU、后置摄像头像素、前置摄像头像素等等,我们可以轻易地通过这些特征,了解用户大概需要什么东西。如果用户浏览的是 2880 的 某 pro 7 手机,那么某米 6 的手机可能更适合该用户。

而文章是一种非结构化的数据,除了作者、写作日期这一类的信息,我们很难直接描述其特性,也就难以判定文章之间是否是相似的。因此,我们就需要从文章中抽取出关键词,或称为标签,从而判断出用户喜欢的是某一种类别。

对于使用标签来向用户推荐产品的应用来说,标签生成方式有四种方式:

  • 手动标签
  • 机器生成推荐
  • 用户手动标记(UGC)
  • 混合学习式

手动标签

即,用作者、发布者手动添加相关标签,这种方式往往是最靠谱的。毕竟作者会比较专业,如文章《

深度学习和神经网络简介

有一次,我和Vito(我的合伙人)聊起了当下热门的几种技术趋势。当谈及它们在未来可能的发展前景的时候,Vito说了下面的一段话:

人工智能是个信息革命到蒸汽机规模之间的机会,相比之下虚拟现实应该是移动互联网级别的,而用户个性化服务应该是伴生规模的。

如果人工智能技术带来的变革确实能够比拟工业革命的话,那么它势必会成就一代人,同时也淘汰掉一代人。而且,仔细想想,其实人工智能离我们并不遥远,甚至可以说已经开始深入到我们的日常生活中了。从iPhone里的Siri,到各大网站的内容推荐系统,再到图像识别和人脸识别技术的广泛应用,这些场景的背后都有这项技术在发挥作用。…

我是如何为技术博客设计一个推荐系统(上):基于统计与评分

过去的两周里,我一直忙于为 『玩点什么』 设计一个推荐系统(即,recommend system)。在这个过程中,参考了之前的 几本书籍,查找了一系列的资料。想着这些资料上,大部分都是大同小民的,实现了几个简单的推荐功能,改进了标签推荐算法,便想着写篇文章记录一下。

玩点什么』,是一个基于 DjangoPython 的 CMS 系统(Mezzanine)。是的,和我的博客使用的是同一个 CMS 系统。由于使用的是 Python 语言,因此对于机器学习具有天生的优势。…

推荐系统要解决的问题

用基于物品的协同过滤算法

 

1 topN推荐
2覆盖率   多样性 新颖性  惊喜度  信任度 实时性

对于 UserCF ,首先需要找到和他们看了同样书的其他用户(兴趣相似的用户),然后给他们推荐那些用户喜欢的其他书

 

对于 ItemCF ,需要给他们推荐和他们已经看的书相似的书,比如作者 B 看了很多关于数据挖掘的书,可以给他推荐机器学习或者模式识别方面的书。

冷启动问题?提供非个性化推荐:如热门排行榜,利用用户注册信息

利用用户标签数据   用户打标签 --专家打标签

 

利用社交网络数据

一定要有日志系统

要不要推荐理由

 

用户反馈模块——包括Play(播放)、评分和Not Interested(不感兴趣)3种。

上下文信息(时间上下文:时间效应,地点上下文)

利用社交网络数据(电子邮件,用户注册信息,位置数据,)

参考:

https://cloud.baidu.com/product/bdl.html?track=cp:nsem|pf:pc|pp:bdl|pu:paddle|ci:|kw:61645
http://www.paddlepaddle.org/index.cn.html
https://www.librec.net/
https://www.librec.net/dokuwiki/doku.php?id=blogs#%E6%8E%A8%E8%8D%90%E7%AE%97%E6%B3%95

 

 

网页部署https后,如何提升SSL评分到A+

  

牛犊网部署https不知不觉也将近四个月了,期间也一直没有再去进行管理和优化,也没有大家担心的那样访问会因为多次握手有所延迟,一直加载挺快。我想主要还是因为我们这一代人终于搭上了“网络运营商降价提速”的国家政策快车,站长们也基本不用再担心担心客户端的网速问题,而去不断优化JS\CSS\HTML代码了。当然,打铁还需自身硬,自己的服务器配置、带宽还是要跟上时代的步伐的。

牛犊网从2014年搬迁至阿里云之后,由于接入的是BGP网络,访问一直飞快。本来近期有把服务器搬迁至百度云的打算,怎奈一直抢不到6个月免费试用的活动资格,又见阿里云在搞全民计算活动,就趁此将牛犊网的服务器进行了一次升级。

我是一个爱折腾的人,花了一天时间将网站打包下载,上传到新服务器,部署完IIS和SQL后就可以直接访问了,因为文件数据分离,搬迁部署也非常容易。到最后环节就是部署域名证书了。结果闲着无事,就去SSL验证网站(https://www.ssllabs.com/ssltest/)去验证了下安全评级,幸运的是,因为我是win2016服务器,自带IIS10,自动开启http/2.0,检测结果是A。但是看到人家的检测结果是A+,心里就痒痒呀,忍不住就去寻找攻略。

从SSL-LABS上的检测结果来看,网站的HSTS和HPKP的头部没有部署,从百度安全指数网(https://bsi.baidu.com/topic/https.html)查询部署漏洞,也可以得到结果。通过两个头部部署要求分析,HSTS的部署方式较为简单,HPKP的较为复杂,而且容易出错,因此,我选择先从HSTS头部部署开始。

这里我只讲IIS10(IIS7 和 IIS8 同样适用)的部署方案:

这里插一句,如果你的评分低于A,而且还是win+IIS服务环境,可以下载IIS Crypto(地址:https://www.nartac.com/Products/IISCrypto/Download)进行最优安全优化,这样就可以到达A级评分了,然后再来部署HSTS。

最后开始部署HSTS,其实非常的简单,在部署了域名证书的前提下,只要在IIS10设置的HTTP响应标头组件中添加HSTS的访问识别时长就可以了。

内容填写如下:

 

  名称:Strict-Transport-Security

值:max-age=31536000; includeSubDomains; preload

 

这个值是秒,换算过来正好一年。它的意思是接下来的一年时间,强制浏览器浏览页面通过https来访问,这样就可以避免运营商通过http跳转和DNS劫持投放广告了,是不是更安全了呢?

最后,再一次去ssllabs安全评分,就可以拿下A+了,此时成就感爆棚(看图1)~

攻略至此结束,只想说微软的服务器系统设置真的是越来越方便的,部署网络基础环境也是,基本也是无脑留的下一步,下次我找时间讲讲IIS 10如何部署网络基础环境。感谢欣赏和倾听我的唠叨!

作者:琚叶青,牛犊网站长

    

网站开启HSTS严格HTTPS功能并加入HSTS Preload List

从今天开始,土木坛子开启HSTS(HTTP Strict Transport Security)严格强制HTTPS SSL功能。

我一直支持HTTPS,在启用全站HTTPS后,用301的方式将所有HTTP访问请求自动转成HTTPS加密。但这种服务器端301的方式,并不能阻止浏览器到服务器之间HTTP链接被截持,因为此时的通信,并不是HTTPS。

启用HSTS协议后,在初次访问HTTPS后,用户在浏览器中再输入HTTP链接,浏览器本身会将HTTP链接自动转成HTTPS,会更加全面保护访问者的隐私,例如,没有人能在网络上截取你访问过土木坛子上关于艳照门的博文。…