'성공과 실패를 결정하는 1%의 네트워크 원리' 책을 바탕으로 정리한 내용입니다.
connect에서 애플리케이션에 제어가 되돌아오면 데이터 송·수신 동작이 되고 애플리케이션이 write를 호출해 송신데이터를 프로토콜 스택에 건네주고 이것을 받은 프로토콜 스택이 송신 동작을 실행한다.
받은 데이터를 바로 송신하는 것이 아니라 버퍼 메모리 영역에 저장 후 애플리케이션에서 다음 데이터를 건네주기를 기다림
→ 기다리는 이유는 한꺼번에 송신 의뢰하는 경우도 있고, 1바이트나 1행씩 건네주는 방법도 있어서 프로토콜 스택에서 길이를 제어할 수 없다.
→ 데이터 길이를 알지도 못한채 받아온 데이터를 바로 보내주면 네트워크 이용 효율에 문제가 생김
송신 동작의 판단 요소
한 패킷에 저장할 수 있는 데이터 크기
- MTU 매개 변수
: 한 패킷으로 운반할 수 있는 디지털 데이터의 최대 길이,
이더넷에서는 1,500바이트- MSS
: 패킷의 헤더를 제외하고 하나의 패킷으로 운반할 수 있는 데이터의 최대 길이,
MSS를 초과하거나 MSS에 가까운 길이에 이르기 까지 데이터를 저장하고 송신동작을 하면 패킷을 잘게 나눌 걱정할 필요 없다.
타이밍
: 송신 속도가 느려지는 경우 버퍼에 데이터가 모이지 않아도 적당한 곳에서 송신 동작 실행,
프로토콜 스택의 내부 타이머로 일정 시간 이상 경과 하면 패킷을 송신
→ 전자를 중시할 경우 패킷 길이가 길어져 네트워크 이용 효율 높아지지만 버퍼에 머무는 시간 만큼 송신 동작이 지연 될 수 있음.
→ 후자를 중시할 경우 지연은 적어지지만 이용 효율이 떨어질 수 있음
HTTP 리퀘스트 메세지 중 한 개의 패킷을 넘어가는 긴 메세지 일 경우
TCP에는 송신한 패킷이 상대에게 올바르게 도착했는지 확인하는 동작으로 넘어간다.
📌
시퀀스 번호는 1부터 시작하지 않고 난수로 시작해 예측할 수 없게 만듦.
그러나 난수로 지정하게 되면 초기값을 알 수 없는 문제가 생김으로 접속 동작 부분에서 SYN이라는 제어비트를 1로 하여 초기값을 통지한다.
→ SYN에 1를 설정할 때 시퀀스 번호에도 값을 설정하게 되어 시퀀스 번호의 값이 초기값을 나타낸다.
📌
TCP의 데이터 송·수신 동작은 양방향이므로 클라이언트에서 서버로 향하는 데이터 흐름과 서버에서 클라이언트로 향하는 두가지 데이터 흐름이 있어서 각각 대응해줘야한다.
→TCP는 이 방법으로 확인 할 때 까지 송신한 패킷을 송신용 버퍼 메모리에 보관하고 대응하는 ACK 번호가 상대로부터 돌아오지 않으면 다시 패킷을 보낸다.
타임아웃 값
: ACK 번호가 돌아오는 것을 기다리는 시간
윈도우 제어
: 한 개의 패킷을 보낸 후 ACK 번호를 기다리지 않고 차례대로 연속해서 복수의 패킷을 보내는 방법
핑퐁 방식
: ACK 번호를 기다리지 않고 차례로 패킷을 보내면 수신측의 능력을 초과해 패킷을 보내는 사태가 생길 수 있음
데이터 속도가 애플리 케이션에서 건네주는 속도보다 빠르면 수신 버퍼에 데이터가 넘처흘리게 되는 것을 수신측의 능력을 초과한다는 의미
윈도우 필드
: 수신 처리가 끝나고 수신 버페어 빈 부분이 생기면 그 분량만큼 수신할 수 있는 데이터 양을 늘려서 TCP 헤더의 윈도우 필드에서 송신측에 알린다.
윈도우 사이즈
: 수신가능한 데이터 양의 최대값
브라우저는 리퀘스트 메시지를 송신해 달라고 의뢰하고, 응답 메세지를 받기 위해 read 프로그램을 호출한다.
read를 경유해 프로토콜 스택에 제어가 넘어가고, 프로토콜 스택이 움직인다.
데이터를 임시 보관하는 수신 버퍼를 사용한다.