TCP 연결에 대한 착각
Source Port와 Destination Port는 각각 16bit 즉 2의 16제곱인 0~65535 범위이다. 그중 0과 65535는 안쓰므로 1~65534이다.
Sequence Number는 앞서 포스팅했던 [TCP 송/수신 원리]에서 말했던 Segment 번호이다. 이는 32bit이므로 경우의 수는 2의 32제곱이므로 용량으로 환산하면 대략 ‘4GB’이다.
Sequence 번호에는 기본적으로 Syn(연결하자), Ack(응답하자)가 있고 이 두가지를 가지고 얘기해보자 한다.
연결이란 무엇인가? 연결이 됐다! 의 근거가 무엇인가?
사람#1 이 사람#2에게 전화를 하는 과정에는 1. Call이가면 2. 응답이 온다 그 이후 통화가 시작된다. 그럼 이 둘은 전화연결이 되었다고 말할 수 있는건가?
만약에 사람#2와 똑같은 목소리를 가진 사람#3이 전화를 받을 가능성은 없을까?
그럼 사람 #1은 사람#2가 아니라 사람#3과 통화하는 것인데..인지를 할까?
상대방이 사람#2가 아니고 Fake를 쓴건데 사람#1이 인지할 수 없지않은가.
연결이 되었다고 ‘착각’일뿐.
연결을 위해서 TCP에서 주로하는 방법론이 있다.
뭐가 왔다갔다 왔다갔다하는데. 이 때 왔다갔다하는 단위가 Segment다.
그러니까 Segment하나가 날라가는데 SYN이 1이라며 세트가 된거다.(SYN1000)여기서 서버는 LISTEN하고 있다가 Web의 경우 일반적으로 80번으로 기다리고 있다가 SYN을 받았다가 SYN을 잘받았다며 ACK(1001)와 함께 자신의 SYN(4000)을 보낸다. 근데 Flag라는게 조합이 가능하다보니 SYN과 ACK를 합쳐서 한방에 ACK(4001)로 보낸다.
3-Way Handshake은 기본적으로 Sequence Number를 교환하는 행동이다. 그런데 교환할 때 MSS도 교환한다. 만약 MSS가 Client가 MSS를 1460이라고 Server에 보냈는데 Server의 MSS가 1400밖에 안되면 1400으로 하향평준화해서 보낸다. (작은놈한테 맞춰야 수신이되니까)
또한 Sequence Number + MSS와 더불어 ‘정책’을 교환한다. 이 정책은 혼잡제어와 관련된 정책으로 네트워크에 문제가 나서 수신이 안되는 등 혼잡상황을 제어하기 위해 보통 SACK을 쓴다.