[Day56] Node.js - TCP / IP(하)

Validator·2023년 9월 1일
0

TCP의 작동(3-way handshake)

TCP를 사용하는 송신자와 수신자는 데이터를 전송하기 전 먼저 서로 통신이 가능한 지 의사를 묻고 한 번에 얼마나 받을 수 있는지 등의 정보를 확인합니다. 앞서 언급했던 신뢰성 있는 통신을 하기 위함이다. 데이터를 안전하고 빠지는 부분이 없게 보내기 위함이다. 사람 간에 전화통화를 하는 상황을 예를 들면 이해가 빠르다.

첫 번째, 전화번호를 누른다. 상대방의 전화가 꺼져있지 않다면 연결음이 들리면서 연결을 시도한다.
두 번째, 상대방이 전화를 받고 상대방의 목소리가 잘 들린다.
세 번째, 여보세요?라는 한 마디와 함께 상대방이 자신의 목소리가 잘 들리는 지 확인한 후 대화를 시작한다.

TCP도 이와 유사한 방식을 가지고 있다. TCP는 TCP Header 내의 'SYN', 'SYN/ACK', 'ACK' Flag를 사용하여 3-way handshake를 한다.

첫 번째, 송신자가 수신자에게 'SYN'을 날려 통신이 가능한지 확인한다. 이 때 port가 열려있어야 한다.
두 번째, 수신자가 송신자로부터 'SYN'을 받고 'SYN/ACK'을 송신자에게 날려 통신할 준비가 됐음을 알려준다.
세 번째, 송신자가 수신자의 'SYN/ACK'을 받고 'ACK'을 날려 전송을 시작함을 알린다.

이것을 3-way handshake라고 부른다.

TCP로 이루어지는 모든 통신은 반드시 3-way handshake를 통해 시작한다. 수신자가 받을 준비가 있는지, 송신자가 보낼 준비가 되어있는지를 미리 확인한 후 통신을 시작하여 데이터를 안전하게 보내는 개념이다. 그리고 데이터를 받았을 때 잘 받았음을 알리는 'ACK'를 송신자에게 날린다. 송신자는 이 'ACK'를 보고 수신자가 데이터를 잘 받았음을 확인하고 다음 데이터를 전달할 준비를 하는 것이다.

이 밖에 주로 사용하는 Flag로는 RST, FIN, FIN/ACK, PUSH 등이 존재한다.


TCP의 특징

TCP의 특징 중 첫 번째는 바로 흐름제어이다. 송신자는 자신이 한 번에 얼마나 보낼 수 있는지, 수신자는 자신이 데이터를 어디까지 받았는지 끊임없이 확인하고 TCP Header 내의 'Window Size'를 사용해 한번에 받고, 보낼 수 있는 데이터의 양을 정한다. 여기서 window는 일정량의 데이터를 말한다. 받는 측의 사정이 더 중요하다보니 Window Size는 수신자가 정하게 된다. (3-way handshake 때 정한다)

그렇게 자신의 상황에 따라 Window size를 조절하는 것이다. 자신이 지금까지 받은 데이터 양을 확인하여 송신자에게 보내는데 이를 'Acknowledgement Number'라고 한다. 만약 수신자가 300번 째 데이터를 받았으면 'Acknowledgement Number'에 1을 추가하여 301을 보내게 된다. 300번 까지 받았으니 301번 부터 보내라는 의미이다.
이 데이터의 순서 번호를 표기한 것이 바로 'Sequence Number'이다.

TCP의 특징 중 두 번째는 혼잡제어이다.
데이터를 주고 받는 양 단말(Endpoint)도 중요하지만 데이터가 지나가는 네트워크망의 혼잡 또한 중요하다. 다양항 방법이 있지만 그 중, Slow Start가 대표적이다. 연결 초기에 송신자와 수신자가 데이터를 넉넉히 주고받을 준비가 돼있더라도, 중간 경로인 네트워크가 혼잡하다고 한다면, 제대로 보낼 수 없을 것이다.

그리하여 송신자는 연결 초기에 데이터 송출량을 낮게 잡고 보내면서 수신자의 수신을 확인하며 데이터 송출량을 조금씩 늘리게 된다. 그렇게 하여 현재 네트워크에서 가장 적합한 데이터 송출량을 확인할 수 있게되는 것이다. 이것이 바로 'Slow Start'이다.

0개의 댓글