name
getsockopt - get options on sockets
synopsis
#include
#include
int getsockopt (int s, int level, int optname, void *optval, socklen_t *optlen);
函式的呼叫關係圖如下:
核心版本:2.6.37
int tcp_getsockopt (struct sock *sk, int level, int optname, char __user *optval, int __user *optlen)
static
int do_tcp_getsockopt (struct sock *sk, int level, int optname, char __user *optval, int __user *optlen)
case tcp_quickack:
val = ! icsk->icsk_ack.pingpong; /* 快速確認模式 */
break;
case tcp_congestion:
if (get_user(len, optlen))
return -efault;
len = min_t(unsigned
int, len, tcp_ca_name_max); /* 16 bytes */
if (put_user(len, optlen)
return -efault;
if (copy_to_user(optval, icsk->icsk_ca_ops->name, len)) /* 預設為cubic */
return -efault;
return
0; case tcp_cookie_transactions :
...case tcp_thin_linear_timeouts:
val = tp->thin_lto; /* 預設為0 */
break;
case tcp_thin_dupack:
val = tp->thin_dupack; /* 預設為0 */
break;
case tcp_user_timeout:
val = jiffies_to_msecs(icsk->icsk_user_timeout);
break;
default:
return -enoprotoopt;
}if (put_user(len, optlen))
return -efault;
if (copy_to_user(optval, &val, len))
return -efault;
return
0;}
static
inline
int keepalive_time_when(const
struct tcp_sock *tp)
static
inline
int keepalive_intvl_when(const
struct tcp_sock *tp)
static
inline
int keepalive_probes(const
struct tcp_sock *tp)
/* return information about state of tcp endpoint in api format. */zhangskd @ csdn blogvoid tcp_get_info(struct sock *sk, struct tcp_info *info)
if (tp->ecn_flags & tcp_ecn_ok)
info->tcpi_options |= tcpi_opt_ecn; /* ecn選項使用與否 */
info->tcpi_rto = jiffies_to_usecs(icsk->icsk_rto); /* rto,單位微秒 */
info->tcpi_ato = jiffies_to_usecs(icsk->icsk_ack.ato); /* predicted tick of soft clock */
info->tcpi_snd_mss = tp->mss_cache; /* 本端mss */
info->tcpi_rcv_mss = icsk->icsk_ack.rcv_mss; /* 對端mss */
if (sk->sk_state == tcp_listen) else
info->tcpi_lost = tp->lost_out; /* 丟失的資料報數 */
info->tcpi_retrans = tp->retrans_out; /* 重傳的資料報數 */
info->tcpi_fackets = tp->fackets_out; /* facked的資料報數 */
info->tcpi_last_data_sent = jiffies_to_msecs(now - tp->lsndtime); /* 最近一次發資料報的時間間隔 */
info->tcpi_last_data_recv = jiffies_to_msecs(now - icsk->icsk_ack.lrcvtime); /* 最近一次收資料報的時間間隔 */
info->tcpi_last_ack_recv = jiffies_to_msecs(now - tp->rcv_tstamp); /* 最近一次收ack包的時間間隔 */
info->tcpi_pmtu = icsk->icsk_pmtu_cookie; /* last pmtu seen by socket */
info->tcpi_rcv_ssthresh = tp->rcv_ssthresh; /* current window clamp*/
info->tcpi_rtt = jiffies_to_usecs(tp->srtt) >> 3; /* 平滑的rtt */
info->tcpi_rttvar = jiffies_to_usecs(tp->mdev) >> 2; /* 四分之一mdev */
info->tcpi_snd_ssthresh = tp->snd_ssthresh;
info->tcpi_snd_cwnd = tp->snd_cwnd;
info->tcpi_advmss = tp->advmss; /* 本端能接受的mss上限,在建立連線時用來通告對端 */
info->tcpi_reordering = tp->reordering; /* 沒有丟包時,可以重新排序的資料段數 */
info->tcpi_rcv_rtt = jiffies_to_usecs(tp->rcv_rtt_est.rtt) >> 3; /* 作為接收端,測出的rtt值 */
info->tcpi_rcv_space = tp->rcvq_space.space; /* 接收快取的大小 */
info->tcpi_total_retrans = tp->total_retrans; /* 本連線的總重傳個數 */
}
運輸層筆記 TCP
tcp ip tcp 流量控制 差錯控制 擁塞控制 tcp報文段 程序到程序的通訊 流交付服務。全雙工通訊 復用和分用 面向連線的服務。兩個tcp之間建立虛連線,而不是物理連線。可靠的服務 編號系統 tcp是面向位元組的,所以首部中的序號和確認號字段所指的都是位元組的編號 流量控制 tcp能夠使用面...
傳輸層 TCP協議
1 序號 在乙個tcp連線中傳送的位元組流中的每乙個位元組都按順序編號,本欄位表示本報文段所傳送資料的第乙個位元組的序號。2 確認號 期望收到對方下乙個報文段的第乙個資料位元組的序號。若確認號為n,則證明到序號n 1為止的所有資料都已正確收到。即採用累計確認 3 資料偏移 首部長度 tcp 報文段的...
傳輸層TCP協議
面向連線,可靠傳輸,面向位元組流 tcp協議 面向連線 accept 獲取新連線 1.當呼叫accept之後,核心就會為新連線建立乙個套接字描述符,服務端使用該套接字描述符進行和客戶端進行資料通訊 2.連線建立之後,雙方都可以傳送資料 確認msg1 確認的行為是傳輸層tcp協議的行為,不是應用層的行...