TCP란 Point to Point, 1 대 1연결만이 가능한 프로토콜이다. 한번에 여러 클라이언트가 서버에 접속하니 1대다가 아니냐고 할 수 있겠지만, 이는 실제로는 각 클라이언트별로 포트틀 할당하고 커넥션을 열어주는것이기에 1대 1이다.
TCP에서는 Full Deplex Data가 가능하다. 양방향 통신이 가능하고, MSS를 타협해서 양을 제한할 수 있다.
TCP는 Cumulative ACK를 쓰고있다.
또한 TCP는 UDP와 차별적인 기능으로 Pipelineing과 flowcontrol을 통한 윈도우 사이즈 컨트롤과 congestion기능이 존재한다.
또한, TCP는 4way handShake, 즉 한쪽이 끊는다고 하면 그 방향만 끊어지는것이지 두 방향 모두 끊어지는 것이 아니다. 이 과정에서 메시지가 4번 주고받아지기 떄문에 4way이다.
전체 사이즈는 한 줄당 32bit 4byte 짜리 5줄이다.
그리고 그 아래 헤더로 처리하지못한 기능을 추가로 처리하는 옵션 기능이 있긴한데 있을 수도 있고 없을수도 있다.
따라서 데이터가 어디서 시작하는 알려주기 위해서 헤더사이즈에 대한 정보를 헤더에 넣어주면 된다.
옵션을 안쓰면 20바이트겠지만 옵션을 쓰면 데이터 시작점이 변하기 떄문이다.
출발지 포트, 목적지 포트
시퀀스넘버 (바이트 단위로 시퀀스넘버를 줘서 굉장히 길다)
ACK 넘버 (시퀀스가 크니깐 에크넘버도 크다)
에크메시지의 의미 있고 없고는 플랩영역에 들어있다.
플랩영역에는 헤더라인수 표기하는 필드(16), RSF라는 커넥션 관리용 제어메시지 기능도 들어있다. R은 트레이서 라우트용, S는 세팅, F는 커넥션 종료이다.
CE 는 congestion notification
리시브 윈도우 : 플로우컨트롤을 위해서 리시버가 받을 수 있는만큼의 바이트를 가지고있다. 하지만 리시버윈도우는 크기가 16비트인데 이를 늘리려면 option에 스케일팩터를 넣어주면 된다.
Urg data는 아예 안쓴다
체크섬 (에러체크)
옵션 (없을수도 있음)
Application data (데이터)
바이트 단위의 ACK, Seq를 가진다. 따라서 보내는 데이터의 byte수 만큼 더해야 다음 seq혹은 ack가 나오게된다.
지금은 1이라서 1씩만 늘었지만 만약 10이라면 seq가 52될 것이다.
타이머가 너무 길면 로스에 대한 반응이 느려지고, 너무 짧으면 premature timeout이 자주 발생하고 불필요한 재전송이 생긴다
이에 보통은 RTT보다 살짝 크게해야한다. 하지만 RTT는 변동적이다. 따라서 이 RTT를 잘 구해야한다.
러한 방식을 Expotential Weighted Moving Average라고 한다.
아무래도 현재값이 그 어떠한 에버리지 보단 정확하기에 에버리지값에 대한 현재 값에 대한 가중치를 주는데 이게 .125나 된다.
그리고 이제 이 RTT값에 마진을 줘서 안전장치를 마련해야한다.
위와 같은 식으로 마진을 구하고, 이 마진의 4배 + EstimatedRTT를 더한것이 TimeoutInterval이 된다.
아까 보낸거에대한 에크가 온건지, 지금온건지 알 수가 없기때문에 sampleRTT에서는 retransmission을 빼야한다