Microsoft ICS Nuisance and netsh
What is Microsoft ICS? It stands for the built-in Internet Connection Sharing function in Windows since Windows 98 SE for sharing a single internet connection from a PC with multiple internet connection interface to other PCs in a LAN.
Now, you might ask me why I’d ever do that instead of using a stand-alone router/switch? It just so happens that the router, and the Verizon provided router/modem at my house went out at the same time… It is not the first time that the Verizon Westell 6100G Router/Modem has left me frustrated. The Westell 6100G has extremely poor performance and stability holding a DSL Sync. 80% of the time when the Westell 6100G loses DSL sync, it freezes up with me unable to access its interface, and the only course of action is to restart the modem which takes at least a minute+ to re-sync itself and remap the MAC/IP Table for routing only to lose sync again and freeze itself.
It wouldn’t be a problem if the intermittent DSL connection only happen rarely, but the Verizon line to my apartment has had the intermittent connection problem for the entire year, and I’ve made more than dozens call to Verizon with poor tech and unhelpful sales team. It also strikes me that Verizon rather that I pay for a lesser plan (1mbit downstream max), instead of capping my 4-7mbit downstream plan to 4Mbit Downstream. It just frustrates me that Verizon would just feed the highest speed “available” to a location instead of feeding the connection on the grounds of stability.
Aside from all that drama from Verizon, I’ve decided to switch temporary to my ancient ZyXel Prestige 600 I inherited back in the days with SpeakEasy. Although I still lost connections on the ZyXel Prestige 600, but the re-sync took around 20 second, without my user input. Which is still “acceptable” for browsing static pages… Because I have multiple devices around my home, I use a switch to feed them connection, and without a router, I was left with utilizing the Microsoft ICS on my main PC which will act like a DHCP server for the rest of my home network.
Everything was easy by following this article on Microsoft: Using ICS (Internet Connection Sharing)
So what happened after? Everything worked perfectly on the “main PC,” and other clients seem to be able to access Google and Wikipedia (which is usually my first test if connection worked). Then after my roommate reported problem of accessing Yahoo and Hotmail, I was at disbelief first, but tried it on my own laptop which was also a client, and he was right! I was dumbfounded at how was that possible.
Then after some poking around on Google, I found that this problem existed for quite a while with using ICS on a DSL connection. The root of the problem is MTU misconfiguration on the main PC because most Windows computer (Windows 7 in my case) is set at default 1500 MTU, but DSL (Verizon in my case, but varies with ISP) uses 1491 or 1451 as the MTU. Back in the days of XP, you change MTU by accessing the registry, but since then there is a neat CLI called netsh to configure MTU.
Here is a step by step tutorial on how to configure MTU on a Windows 7 computer.
First, access your Command Prompt in administrator mode by “Right-Click” on the Command Prompt and Run as administrator in the Start menu. Make sure you have administrator privilege on the computer you are working on.
From here on each (separated by space) bold denotes a context level in netsh which you can reach by typing it directly at the previous level of the context. The entire italic is the command that you type.
Now, type netsh in the command line to enter netsh configuration.
At this point you can use ? or help at each level of command to view a list of option and a short description. Typing .. will bring you back to the previous context level.
Since our goal here is to change the MTU on our network interface we will be going down the interface context. Alternatively, if you just want to change the MTU, you can do so right at the root of netsh by using this command:
interface ipv4 set interface “NAME OF INTERFACE” MTU=xxxx
The “NAME OF INTERFACE”** is basically the name of the connection Control PannelNetwork and InternetNetwork Connections or more commonly known as the name of the Ethernet adapter. You can also find the available interface in netsh by using this command at the root:
interface show interface or,
interface ipv4 show interface for showing ipv4 specific interfaces’ detailed information which is what we are working with at the moment.
You can also check the current interface setting by using this command at the root:
interface ipv4 show interface “NAME OF INTERFACE”
Since ICS involves an interface connected to a modem, and an interface serving clients, you MUST configure both interface with the correct MTU.
That’s it. There is plenty more options to play around with in netsh, and you can get around pretty easily with the help. In addition, you can type a command followed by a space and then ? to see available options for that specific command.
** For Non-standard English language Windows Version (especially East Asian Languages i.e. Japanese/Chinese), the netsh has trouble recognizing the localized default name “Local Area Connection” in East Asian characters. In this case, I recommend renaming those interfaces into an easy to type English name such as “Local 1”.